如何使用linq通过多个变量从列表中删除对象

时间:2011-07-19 14:20:17

标签: c# linq

我想使用linq从列表中删除对象, 例如:

public class Item
{
    public string number;
    public string supplier;
    public string place;
}

现在我要删除所有具有相同数量和供应商的项目,这些项目出现的时间超过一次 感谢

1 个答案:

答案 0 :(得分:5)

这在原地进行会稍微繁琐,但如果您不介意创建新列表,则可以使用LINQ。

指定项目相等性定义的最简单方法是投影到匿名类型的实例 - C#编译器代表您添加一个明智的相等实现:

List<Item> items = ...

// If you mean remove any of the 'duplicates' arbitrarily. 
List<Item> filteredItems = items.GroupBy(item => new { item.number, item.supplier })
                                .Select(group => group.First())
                                .ToList();

// If you mean remove -all- of the items that have at least one 'duplicate'.
List<Item> filteredItems = items.GroupBy(item => new { item.number, item.supplier })
                                .Where(group => group.Count() == 1)
                                .Select(group => group.Single())
                                .ToList();

如果我的第一个猜测是正确的,您还可以考虑编写IEqualityComparer<Item>然后使用Distinct运算符:

IEqualityComparer<Item> equalityComparer = new NumberAndSupplierComparer();
List<Item> filteredItems = items.Distinct(equalityComparer).ToList();

顺便说一下,类型暴露公共字段(使用属性)或公共成员具有驼峰式名称(使用pascal-case)并不常见。这将更加惯用:

public class Item
{
    public string Number { get; set; }
    public string Supplier { get; set; }
    public string Place { get; set; }
}