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

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

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

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

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

 var uniqueNames = new Hashset(); // Original select statement CSVCategories = CSVCategories.Where(x => uniqueName.Add(x.Name)).ToList(); 

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

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

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

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

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

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