我的列表有这个问题,我似乎无法解决它
我有一个实现具有以下方法的接口的类。
public List<T> CalculateWad<T, TH>(
List<T> outputList,
List<TH> inputList,
bool flag)
{
...
}
现在,我有一个输出列表和一个带有公共字段合同的输入列表。我需要在输出列表中删除输入列表中存在的所有合同。
它必须尽可能通用。我似乎无法获取列表的字段。
有任何想法吗?
我的列表有这个问题,我似乎无法解决它
我有一个实现具有以下方法的接口的类。
public List<T> CalculateWad<T, TH>(
List<T> outputList,
List<TH> inputList,
bool flag)
{
...
}
现在,我有一个输出列表和一个带有公共字段合同的输入列表。我需要在输出列表中删除输入列表中存在的所有合同。
它必须尽可能通用。我似乎无法获取列表的字段。
有任何想法吗?
为了访问 Contract 属性,泛型 T 和 TH 必须实现与 Contract 属性的接口。
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();
}
}
这应该通过添加一个公共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
您在文本中提到的 。但是,它确实返回了列表的新更改副本,这可能是方法签名所描述的内容。
所以这是你的界面:
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)
}
}
标志变量有什么用?