从通用列表中删除

时间:2012-08-13 12:30:10

标签: linq

我有这个列表的问题,我似乎无法修复它

我有这个类实现了一个具有以下方法的接口。

public List<T> CalculateWad<T, TH>(
    List<T> outputList,
    List<TH> inputList,
    bool flag)
{
    ...
}

现在,我有一个输出列表和一个带有公共字段Contract的输入列表。我需要在outputlist中删除inputlist中存在的所有合同。

它必须尽可能通用。我似乎无法获得列表中的字段。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

为了访问Contract属性,泛型T和TH必须实现具有Contract属性的接口。

文档:where (generic type constraint) (C# Reference)

interface IContractable { string Contract { get; } }

然后,包含CalculateWad方法的类必须定义如下:

class MyClass<T, TH>
    where T : IContractable
    where TH : IContractable
{
    public List<T> CalculateWad(List<T> outputList, List<TH> inputList, bool flag)
    {
        return outputList
                  .Where(o => 
                      inputList.Select(i => i.Contract).Contains(o.Contract) == false)
                  .ToList();
    }
}

答案 1 :(得分:2)

这应该通过添加IHasContractT必须实现的通用TH界面来完成工作:

class Program
{
    static void Main(string[] args)
    {
    }

    private IList<T> CalculateWad<T, TH>(IList<T> output,
        IList<TH> input, bool flag)
        where T : IHasContract
        where TH : IHasContract
    {
        var contracts = new HashSet<string >(input.Select(i => i.Contract));

        var qry = from o in output
                  where !contracts.Contains(o.Contract)
                  select o;

        return qry.ToList();
    }

    private sealed class Contract
    {

    }

    private interface IHasContract
    {
        string Contract { get; }
    }

    private sealed class Foo : IHasContract
    {
        public string Contract { get; set; }
    }

    private sealed class Bar : IHasContract
    {
        public string Contract { get; set; }
    }
}

请注意,不会修改output ,您在文中提到了这一点。但是,它会返回列表的新修改副本,这可能是方法签名所描述的内容。

答案 2 :(得分:0)

所以这是你的界面:

public List CalculateWad(List outputList,List inputList,bool flag){ ... }

你需要这样做吗?假设每个列表中的对象可以通过equals方法进行比较。

public List<T> CalculateWad<T, TH>( List<T> outputList, List<TH> inputList, bool flag) {

              // cast list to be regular object lists
              List out = (List) outputList;
              List in = (List) inputList;

              for(Object object : in){
                  out.remove(object);  // this looks for an object that matches using contract.equals(object)         
              }
}

什么是标志变量?