C# 列表中重复项的计数
Count of duplicate items in a C# list
我想知道如何在 winform 应用程序的 C# 中计算列表中的所有重复字符串。
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
例如我有上面的列表,计数是 5,因为 "red" 出现了 3 次,"blue" 出现了两次。
乐于使用循环或 LINQ 或任何必要的东西。
在我的实际程序中,这个列表可能会很大,有 1000 多个条目,因此性能也是需要考虑的因素。
谢谢!
如果您只需要重复项的计数:
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
var count = colorList.GroupBy(item => item)
.Where(item => item.Count() > 1)
.Sum(item => item.Count());
尝试逐项详细信息:
var result = colorList.GroupBy(item => item)
.Select(item => new
{
Name = item.Key,
Count = item.Count()
})
.OrderByDescending(item => item.Count)
.ThenBy(item => item.Name)
.ToList();
如果您只需要总数:
var total = colorList.GroupBy(_ => _).Where(_ => _.Count() > 1).Sum(_ => _.Count());
对于大数据集可能更快的替代方案:
var hashset = new HashSet<string>(); // to determine if we already have seen this color
var duplicates = new HashSet<string>(); // will contain the colors that are duplicates
var count = 0;
foreach (var color in colorList)
{
if (!hashset.Add(color))
{
count++;
if (duplicates.Add(color))
count++;
}
}
更新:用 2^25(约 3000 万)个条目的列表测量了两种方法:第一个 3.7 秒,第二个 3.2 秒。
好吧,如果没有分组依据,我会这样做
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
var count = 0;
foreach (var item in colorList.Distinct().ToList())
{
var cnt = colorList.Count(i => i.Equals(item, StringComparison.InvariantCultureIgnoreCase));
if (cnt > 1)
count += cnt;
}
在 C# 中计算重复项的另一种方法如下:-
var duplicates = from d in list
group d by d into c
let count = c.Count()
orderby count descending
select new { Value = c.Key, Count = count };
foreach (var v in duplicates)
{
string strValue = v.Value;
int Count = v.Count;
}
不如接受的答案快,但作为参考也可以使用字典来计算命中率:
var map = new Dictionary<string, int>();
foreach (var color in colorList))
{
if (map.ContainsKey(color)) map[color]++;
else map.Add(color, 1);
}
return map.Values.Count(x => x > 1);
它比 LINQ 快得多 GroupBy
我想知道如何在 winform 应用程序的 C# 中计算列表中的所有重复字符串。
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
例如我有上面的列表,计数是 5,因为 "red" 出现了 3 次,"blue" 出现了两次。
乐于使用循环或 LINQ 或任何必要的东西。
在我的实际程序中,这个列表可能会很大,有 1000 多个条目,因此性能也是需要考虑的因素。
谢谢!
如果您只需要重复项的计数:
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
var count = colorList.GroupBy(item => item)
.Where(item => item.Count() > 1)
.Sum(item => item.Count());
尝试逐项详细信息:
var result = colorList.GroupBy(item => item)
.Select(item => new
{
Name = item.Key,
Count = item.Count()
})
.OrderByDescending(item => item.Count)
.ThenBy(item => item.Name)
.ToList();
如果您只需要总数:
var total = colorList.GroupBy(_ => _).Where(_ => _.Count() > 1).Sum(_ => _.Count());
对于大数据集可能更快的替代方案:
var hashset = new HashSet<string>(); // to determine if we already have seen this color
var duplicates = new HashSet<string>(); // will contain the colors that are duplicates
var count = 0;
foreach (var color in colorList)
{
if (!hashset.Add(color))
{
count++;
if (duplicates.Add(color))
count++;
}
}
更新:用 2^25(约 3000 万)个条目的列表测量了两种方法:第一个 3.7 秒,第二个 3.2 秒。
好吧,如果没有分组依据,我会这样做
List<string> colorList = new List<string> { "red", "red", "yellow", "blue", "blue", "orange", "green", "red" };
var count = 0;
foreach (var item in colorList.Distinct().ToList())
{
var cnt = colorList.Count(i => i.Equals(item, StringComparison.InvariantCultureIgnoreCase));
if (cnt > 1)
count += cnt;
}
在 C# 中计算重复项的另一种方法如下:-
var duplicates = from d in list
group d by d into c
let count = c.Count()
orderby count descending
select new { Value = c.Key, Count = count };
foreach (var v in duplicates)
{
string strValue = v.Value;
int Count = v.Count;
}
不如接受的答案快,但作为参考也可以使用字典来计算命中率:
var map = new Dictionary<string, int>();
foreach (var color in colorList))
{
if (map.ContainsKey(color)) map[color]++;
else map.Add(color, 1);
}
return map.Values.Count(x => x > 1);
它比 LINQ 快得多 GroupBy