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

时间:2017-02-18 14:22:40

标签: c# sql linq

我有一个重复名称列表,我想获得没有重复项的列表。

 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();

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

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

3 个答案:

答案 0 :(得分:1)

调用Distinct最不可能,因为您的Category类没有正确实现Equals和GetHashCode。

您有两种选择。正确覆盖Equals和GetHashCode方法,或使用Hashset检查是否尚未添加Name。

var uniqueNames = new Hashset<string>(); 

// Original select statement

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

答案 1 :(得分:1)

我注意到results变量给我带回了一个包含重复项的列表,但只有它们的外壳不同。

E.g。我的原始列表CSVCategories包含以下元素:[“Home”,“home”,“ EmptyString ”,“home”,“Town”,“Town”,“Park”]

使用GroupBy进行重复数据删除时,results查询返回[“Home”,“home”,“ EmptyString ”,“Town”,“Park”],所以它类似工作的。保持空值和具有不同外壳的值。

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

答案 2 :(得分:0)

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

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