C# 如何从字符串数组向列表框添加非重复项

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

在谷歌的帮助下,幸运的是,我能够编写代码,将字符串数组添加到列表框中,并使用LINQ在文本框中显示重复的总数。我现在需要能够从数组中读取数据,并且只在第二个列表框中显示非重复项

以下是我目前掌握的代码:

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;