C# 如何从字符串数组向列表框添加非重复项
在谷歌的帮助下,幸运的是,我能够编写代码,将字符串数组添加到列表框中,并使用LINQ在文本框中显示重复的总数。我现在需要能够从数组中读取数据,并且只在第二个列表框中显示非重复项 以下是我目前掌握的代码:C# 如何从字符串数组向列表框添加非重复项,c#,winforms,linq,C#,Winforms,Linq,在谷歌的帮助下,幸运的是,我能够编写代码,将字符串数组添加到列表框中,并使用LINQ在文本框中显示重复的总数。我现在需要能够从数组中读取数据,并且只在第二个列表框中显示非重复项 以下是我目前掌握的代码: private void Form1_Load(object sender, EventArgs e) { string[] MyStringArray = new string[20]; MyStringArray[0] = "Apple"; MyStringArra
private void Form1_Load(object sender, EventArgs e)
{
string[] MyStringArray = new string[20];
MyStringArray[0] = "Apple";
MyStringArray[1] = "Green";
MyStringArray[2] = "Apple";
MyStringArray[3] = "Red";
MyStringArray[4] = "Orange";
MyStringArray[5] = "Orange";
MyStringArray[6] = "Bananas";
MyStringArray[7] = "Yellow";
MyStringArray[8] = "Mango";
MyStringArray[9] = "Yellow";
MyStringArray[10] = "Cherry";
MyStringArray[11] = "Red";
MyStringArray[12] = "Fig";
MyStringArray[13] = "Brown";
MyStringArray[14] = "Fig";
MyStringArray[15] = "Brown";
MyStringArray[16] = "Fig";
MyStringArray[17] = "Orange";
MyStringArray[18] = "Brown";
MyStringArray[19] = "Cranberry";
lstbDup.Items.AddRange(MyStringArray);
List<string> dups = new List<string>();
for (int i = 0; i < MyStringArray.Length; i++)
{
string current = MyStringArray[i];
if (MyStringArray.Count(s => s == current) > 1 &&
!dups.Contains(current))
{
dups.Add(current);
}
}
txtdupdisp.Text += dups.Count.ToString();
}
使用LINQ运算符从序列中删除重复项:
var uniques = MyStringArray.Distinct().ToList();
foreach(string s in uniques)
yourSecondListBox.Items.Add(s);
或者干脆
yourSecondListBox.Items.AddRange(MyStringArray.Distinct().ToArray());
然而,正如另一个答案所述,你的问题并不清楚。上面的代码检索数组中至少出现一次的每个字符串。这意味着第二个列表框中还会包含出现两次的“Apple”一词。
相反,如果您只想要只出现一次的项目,则来自的答案是正确的,尽管存在更紧凑的版本:
List<string> nonDuplicates = MyStringArray.GroupBy(x => x)
.Where(group => group.Count()==1)
.SelectMany(group => group).ToList();
Linq真的很有趣,它似乎提供了无限种给猫剥皮的方法。要检索非重复的:
var groups = MyStringArray.ToLookup(str => str);
List<string> nonDuplicates = groups.Where(group => (group.Count() == 1)).
Select(group => group.Key).ToList();
你可以这样做
List<string> list = MyStringArray.Cast<string>().Distinct().ToList();
OP想要不同的项目还是只想要不重复的项目?@vc74:问得好。也许我们应该问问OP。啊,这很微妙。然而,从实际代码来看,他似乎想要所有count>1的项。逻辑错误?不完整的代码?是的,我们需要OP的解释。@Steve我想他想要建立两个集合,一个是重复计数>1,另一个是非重复计数=1,让我们看看。在这种情况下,您的解决方案是正确的。把那个组搞定,数到一组。Count@stakx也许我误解了OP,我以为他在寻找非重复项,即列表中只出现一次的项目。Distinct将返回所有唯一的项,即使是具有重复项的项。您是在寻找不同项还是非重复项?
listBox1.DataSource = list;