代码之家  ›  专栏  ›  技术社区  ›  the_tr00per

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

  •  2
  • the_tr00per  · 技术社区  · 6 年前

    我有一个自定义列表。返回所有项。信息结构如下:

    public class Info
      {
        public string Code { get; set; }
        public string ClinicianDescription { get; set; }
      }
    

    我想从列表中排除代码属性在单独列表中查询任何值的任何信息对象。

    在使用了一种干净的方法之后,我尝试了使用.except(),但是我必须将列表转换为看起来不正确的同一个对象。

    到目前为止,我已经尝试过类似的方法:

    List<int> ids = contactList;
    var List<Info> test = info.RemoveAll(x => ids.Any(i => i == x.Code));
    
    4 回复  |  直到 6 年前
        1
  •  7
  •   StuartLC    6 年前

    你可以用 Except 尽管这需要 IEnumerable 不是谓词,在确定 equivalence of two objects

    var blackListCodes = contactList.Select(i => i.ToString()); 
    var test = info.Except(info.Where(i => blackListCodes.Contains(i.Code)));
    

    但正如托马西诺所指出的,这可以被颠倒并简化为:

    var test = info.Where(i => !blackListCodes.Contains(i.Code))
    

    请注意,这将投射一个 新的 可枚举,而不是更改现有 info ,其中 RemoveAll 做。

    只是其他几点-重新编写代码示例:

    • 正如其他人指出的,在 Code 匹配需要在比较中兼容,即不能比较 string Code 带着INTS ids . 这里,因为我们正在使用 .Except 在同一个源集合上,元素的比较将如预期的那样工作,即使它依赖于默认的引用相等性(因为在这两个集合中元素引用相同) IEnumerables )

    • RemoveAll 返回一个int,表示从列表中删除的元素数-无法将结果分配给其他元素 List .

        2
  •  2
  •   Tomas Chabada    6 年前

    您也可以使用此方法:

     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();
    
        3
  •  0
  •   Rahul    6 年前

    为什么你不能用 Contains() 喜欢

    List<Info> test = info
                         .Where(i => !ids.Contains(i.Code)).ToList();
    
        4
  •  0
  •   Deidah    6 年前

    你试着比较字符串和int!