【问题标题】:Compare two sequences IEnumerable.Except in C#在 C# 中比较两个序列 IEnumerable.Except
【发布时间】:2015-11-05 23:16:57
【问题描述】:

我想使用IEnumerable.Except 比较这两个序列的不同之处。

程序说明:程序是一个抛硬币游戏。 1是正面,2是反面。

程序循环 5 次,每次循环程序检查数字是否匹配。数字是 1 或 2 我用的是随机的。如果硬币匹配,它将更新到 listView。

标签:(lbl_Numb_1、lbl_Numb_2、lbl_Numb_3、lbl_Numb_4)生成随机数,1 或 2。lbl_Result_1 复制 lbl_Numb_2 中的数字并将它们添加到 listview1。 lbl_Reslt_2 复制 lbl_Numb_4 并将其添加到 listview2。

我自己试过了,但我似乎无法得到它。

private void btn_Match_Click(object sender, EventArgs e)
{
    //.Next means so that random number is not negative
    lbl_Numb_1.Text = rand.Next(1, 3).ToString();
    lbl_Numb_2.Text = rand.Next(1, 3).ToString();
    //Random Numbers for listbox2
    lbl_Numb_3.Text = rand.Next(1, 3).ToString();
    lbl_Numb_4.Text = rand.Next(1, 3).ToString();

    //This is for the first listbox. 
    if (lbl_Numb_1.Text == lbl_Numb_2.Text)
    {
        lbl_Result_1.Text = lbl_Numb_2.Text;
        //i = shows sequence id
        ListViewItem lvi = new ListViewItem("" + i);
        lvi.SubItems.Add(lbl_Result_1.Text);
        listView1.Items.Add(lvi);
    }

    //This is for the secound listbox
    if (lbl_Numb_3.Text == lbl_Numb_4.Text)
    {
        lbl_Result_2.Text = lbl_Numb_4.Text;
        //i = shows sequence id
        ListViewItem lview = new ListViewItem("" + i);
        lview.SubItems.Add(lbl_Result_2.Text);
        listView2.Items.Add(lview);
    }
}

【问题讨论】:

  • 我很困惑这应该做什么
  • 你能把代码包含在 Enumerable.Except() 中吗?
  • @psoshmo 嗨,您对哪一部分感到困惑?
  • 我不知道为什么你应该在描述的情况下使用IEnumerable.Except。你能提供更多信息吗?
  • @alexm 我的目标是使用 Enumerable.Except 来比较两个列表视图。我没有使用 Enumerable.Except 因为我不知道如何比较两个列表序列。

标签: c# .net ienumerable except


【解决方案1】:

使用 IEnumerable.Except() 时需要小心。因为结果与您比较的结果不同。 示例:

       List<int> l1 = new List<int>();
        l1.Add(1);
        l1.Add(2);
        l1.Add(3);

       List<int> l2 = new List<int>();
        l2.Add(2);
        l2.Add(4);

        IEnumerable<int> l3 = l2.Except(l1); // l3 will have 4
        IEnumerable<int> l4 = l1.Except(l2); //l4 will have 1,3

您可以做的是使用 IEnumberable.Except 两种方式并将其存储在单个列表中。

  IEnumerable<int> e1 = l2.Except(l1);   
  IEnumerable<int> e2 = l1.Except(l2);

    List<int> l3 = new List<int>();
    foreach (var item in e1)
    {
        l3.Add(item);
    }

    foreach (var item in e2)
    {
        l3.Add(item);
    }

l3 将保存两个列表中都不存在的项目。

【讨论】:

    【解决方案2】:

    在您的情况下,不必使用IEnumerable.Except。 比较两个序列最好使用Enumerable.SequenceEqual。

    例如,在这种情况下它会返回 true:

    var list = new List<int>{1,1,2};
    var list1 = new List<int>{1,1,2};
    var k = list.SequenceEqual(list1);
    

    但在这个错误:

    var list = new List<int>{1,1,2};
    var list1 = new List<int>{1,2,1};
    var k = list.SequenceEqual(list1);
    

    【讨论】:

    • 我的目标是在这个程序中使用 IEnumerable.Except @ArtemKulikov
    • 不可能。因为Except 不支持元素的顺序。序列 [1,1,2] 将等于 [1,2,1],但它不正确,对吧?
    • 我可以随意定制程序,我只需要使用IEnumerable.Except。如果我添加另一个包含 1 列的 listView,它将告诉不同的序列。例如在按钮单击时:listview1:序列 1、3、5 具有匹配的数字。 listview2:序列 2 有匹配的编号。那么我可以使用IEnumerable.Except 写出与listview3 中序列4 不匹配的内容吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    相关资源
    最近更新 更多