我有这个列表的问题,我似乎无法修复它
我有这个类实现了一个具有以下方法的接口。
public List<T> CalculateWad<T, TH>(
List<T> outputList,
List<TH> inputList,
bool flag)
{
...
}
现在,我有一个输出列表和一个带有公共字段Contract的输入列表。我需要在outputlist中删除inputlist中存在的所有合同。
它必须尽可能通用。我似乎无法获得列表中的字段。
有什么想法吗?
答案 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)
这应该通过添加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
,您在文中提到了这一点。但是,它会返回列表的新修改副本,这可能是方法签名所描述的内容。
答案 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)
}
}
什么是标志变量?