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

本文关键字:列表 删除 对象 变量 何使用 linq | 更新日期: 2023-09-27 18:02:26

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

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

现在我想删除所有的项目与相同的数字和供应商出现不止一次。
由于

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

这样做有点繁琐,但是如果您不介意创建一个新列表,您可以使用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; }
}