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"], 所以有点奏效了。保留空值和具有不同外壳的值。
现在我需要找到一种方法来删除重复的套管和空字符串。
我有一个重名列表,我想得到没有重名的列表。
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"], 所以有点奏效了。保留空值和具有不同外壳的值。
现在我需要找到一种方法来删除重复的套管和空字符串。