我有一个自定义列表列表。返回所有项目。 Info的结构如下:
public class Info
{
public string Code { get; set; }
public string ClinicianDescription { get; set; }
}
我想从列表中排除任何Info对象,其中Code属性在单独的List中等于任何值。
在一个干净的方法之后,我尝试使用.Except(),但我必须将List转换为看起来不正确的同一个对象。
到目前为止,我尝试过这样的事情:
List<int> ids = contactList;
var List<Info> test = info.RemoveAll(x => ids.Any(i => i == x.Code));
答案 0 :(得分:7)
您可以使用Except
,虽然这需要IEnumerable
,而不是谓词,在确定equivalence of two objects
var blackListCodes = contactList.Select(i => i.ToString());
var test = info.Except(info.Where(i => blackListCodes.Contains(i.Code)));
但正如Tomassino指出的那样,这可以颠倒和简化为:
var test = info.Where(i => !blackListCodes.Contains(i.Code))
请注意,这会投影 new Enumerable,而不是更改现有info
中RemoveAll
所做的元素。
其他一些要点 - 重新编写代码示例:
正如其他人所指出的,Code
匹配中使用的类型需要在比较中兼容,即您无法将string Code
与ids
中的整数进行比较}。这里,因为我们在同一个源集合上使用.Except
,所以元素的比较将按预期工作,即使它依赖于默认引用相等(因为它在IEnumerables
中都是相同的元素引用)。
RemoveAll
返回一个int,表示从列表中删除的元素数量 - 结果无法分配给另一个List
。
答案 1 :(得分:2)
您也可以使用此方法:
List<Info> info = new List<Info>();
//fill info with objects
List<string> excludeCodes = new List<string>();
//fill excludeCodes with values
var result = info.Where(i => !excludeCodes.Contains(i.Code)).ToList();
答案 2 :(得分:0)
为什么你不能像Contains()
一样使用
List<Info> test = info
.Where(i => !ids.Contains(i.Code)).ToList();
答案 3 :(得分:0)
您尝试将字符串与int进行比较!