如何将非重复项添加到字符串数组的列表框中

时间:2014-09-18 07:52:22

标签: c# winforms linq

在Google的帮助下,运气不错,我能够编写代码,将字符串数组添加到列表框中,并使用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();
}

3 个答案:

答案 0 :(得分:5)

使用LINQ的.Distinct()运算符从序列中删除重复的项目:

var uniques = MyStringArray.Distinct().ToList();
foreach(string s in uniques)
    yourSecondListBox.Items.Add(s);

或者只是

yourSecondListBox.Items.AddRange(MyStringArray.Distinct().ToArray());

然而,如另一个答案所述,您的问题并不清楚。上面的代码检索在数组中至少出现一次的每个字符串。这意味着“Apple”(它出现2次)这个词也将包含在第二个列表框中 相反,如果您只想要出现一次的项目,那么vc 74的答案是正确的,尽管存在更紧凑的版本:

List<string> nonDuplicates = MyStringArray.GroupBy(x => x)
                                          .Where(group => group.Count()==1)
                                          .SelectMany(group => group).ToList();

Linq真的很有趣,它似乎给了猫皮肤无限的方法。

答案 1 :(得分:2)

要检索非重复项:

var groups = MyStringArray.ToLookup(str => str);
List<string> nonDuplicates = groups.Where(group => (group.Count() == 1)).
                                    Select(group => group.Key).ToList();

答案 2 :(得分:0)

你可以这样做。

 List<string> list = MyStringArray.Cast<string>().Distinct().ToList();

获得过滤后的数据后,将此列表绑定到您的控件。

listBox1.DataSource = list;