显示列表中的重复项 c#
Posted
技术标签:
【中文标题】显示列表中的重复项 c#【英文标题】:Show duplicates from lists c# 【发布时间】:2020-01-24 17:02:37 【问题描述】:我正在开发一个 WPF 应用程序,在某一时刻,我必须从字符串列表中获取/显示所有重复项。 (带有重复的字符串名称和列表中相同字符串的数量)例如:“列表包含字符串 'Hello' 3 次。”到目前为止,我成功地获得了字符串的名称,但我无法获得它在列表中出现的正确次数。 到目前为止,这是我的代码:
List<String> answerData = new List<String>();
using (mysqlCommand command = new MySqlCommand(query2, conn))
using (MySqlDataReader reader = command.ExecuteReader())
while (reader.Read())
answerData.Add(reader.GetString(0));
var duplicates = answerData
.GroupBy(i => i)
.Where(g => g.Count() > 1)
.Select(g => g.Key);
foreach (var d in duplicates)
MessageBox.Show(""+ d + duplicates.Count().ToString()); //Here I tried to get the number
//with Count() but it doesn't work as I thought it would.
我应该添加/更改什么以获得我想要的结果?
编辑
按照建议将我的代码更改为以下内容:
var duplicates = answerData
.GroupBy(i => i)
.Where(g => g.Count() > 1);
foreach (var d in duplicates)
MessageBox.Show(d.Key + " " + d.Count().ToString());
现在它运行顺利。 谢谢大家!
【问题讨论】:
您只是选择密钥作为返回。删除最后一个Select
.Select(g => g.Key)
您只选择了密钥。如果你想要计数,你应该得到它new g.Key g.Count()
Linq: GroupBy, Sum and Count的可能重复
.Select(g => new key = g.Key, count = g.Count()).ToList();
【参考方案1】:
在duplicates
中存储实际组而不是键:
var duplicates = answerData
.GroupBy(i => i)
.Where(g => g.Count() > 1);
然后您可以遍历这些组:
foreach (var d in duplicates)
MessageBox.Show(d.Key + " " + d.Count().ToString());
此示例计算,即迭代,每个组两次。或者,您可以按照@HimBromBeere 的建议存储包含Key
和Count
的对象。
【讨论】:
【参考方案2】:您只需在Select
中返回号码:
var duplicates = answerData
.GroupBy(i => i)
.Select(g => new Key = g.Key, Count = x.Count() )
.Where(x => x.Count > 1);
请注意,我更改了您的语句顺序以避免重复执行 g.Count()
。
【讨论】:
【参考方案3】:你可以这样做 出于性能原因,您需要使用 Dictionary
List<String> answerData = new List<String>();
Dictionary<string,int> map = new Dictionary<string, int>();
foreach (var data in answerData)
if (map.ContainsKey(data))
map[data]++;
else
map.Add(data, 1);
foreach (var item in map)
if (item.Value > 1)
Console.WriteLine("0 - 1", item.Key, item.Value);
【讨论】:
以上是关于显示列表中的重复项 c#的主要内容,如果未能解决你的问题,请参考以下文章