0

我的列表有这个问题,我似乎无法解决它

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

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

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

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

有任何想法吗?

4

3 回答 3

3

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

文档:where(泛型类型约束)(C# 参考)

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();
    }
}
于 2012-08-13T12:45:11.653 回答
2

这应该通过添加一个公共IHasContract接口来完成,T并且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您在文本中提到的 。但是,它确实返回了列表的新更改副本,这可能是方法签名所描述的内容。

于 2012-08-13T12:51:31.093 回答
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)         
              }
}

标志变量有什么用?

于 2012-08-13T12:42:28.880 回答