GroupBy 从 IEnumerable 对象列表中删除重复项

GroupBy to remove duplicates from IEnumerable list of objects

我有一个重名列表,我想得到没有重名的列表。

 CSVCategories = from line in File.ReadAllLines(path).Skip(1)
                            let columns = line.Split(',')
                            select new Category
                            {
                                Name = columns[9]
                            };

            var results = CSVCategories.GroupBy(x => x.Name)
                         .Select(g => g.FirstOrDefault())
                         .ToList();

我尝试查看元素并使用以下循环进行调试,但它仍然returns列表中的重复项,包括空值的空字符串:

foreach(var item in results)
{
    Console.WriteLine(item.Name);
}

Linq 提倡不变性,因此它永远不会修改您的输入集合。所以 Distinct() returns 一个新集合而不是内联修改集合。尝试:

foreach(var item in CSVCategories.Distinct())
    {
        Console.WriteLine(item.Name);
    }

调用 Distinct 很可能不起作用,因为您的类别 class 没有正确实现 Equals 和 GetHashCode。

你有两个选择。适当覆盖 Equals 和 GetHashCode 方法,或使用 Hashset 检查 Name 是否尚未添加。

var uniqueNames = new Hashset<string>(); 

// Original select statement

CSVCategories = CSVCategories.Where(x => uniqueName.Add(x.Name)).ToList();

我注意到 results 变量给我带回了一个包含重复项的列表,但只是大小写不同。

例如我的原始列表 CSVCategories 包含以下元素:["Home"、"home"、“EmptyString”、"home"、"Town"、"Town", "Park"]

当 de-duplicating 使用 GroupBy 时,results 查询返回 ["Home"、"home"、“EmptyString”、"Town", "Park"], 所以有点奏效了。保留空值和具有不同外壳的值。

现在我需要找到一种方法来删除重复的套管和空字符串。