我有一个重复名称列表,我想获得没有重复项的列表。
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);
}
答案 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);
}