c#根据另一个List <int>删除自定义列表中的项目

时间:2018-05-23 12:28:21

标签: c# list

我有一个自定义列表列表。返回所有项目。 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));

4 个答案:

答案 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,而不是更改现有infoRemoveAll所做的元素。

其他一些要点 - 重新编写代码示例:

  • 正如其他人所指出的,Code匹配中使用的类型需要在比较中兼容,即您无法将string Codeids中的整数进行比较}。这里,因为我们在同一个源集合上使用.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进行比较!