【问题标题】:How to retrieve Distinct string values from comparing two Arrays?如何通过比较两个数组来检索不同的字符串值?
【发布时间】:2018-06-30 23:52:55
【问题描述】:

我想从 sql 数据库中检索缺席学生姓名。 我有一个列表框,其中有当前学生 Rfid 数据(类似于 42 39 A0 11),我已将学生详细信息与 Rfid 一起存储在数据库中作为 nvarchar(1500) 数据类型。

使用列表框中的当前学生 ID,我想在列表中检索缺席学生的姓名。

然后我想到了使用foreach循环来删除id在Listbox中的学生

但是,当我定义了两个列表,如总计并带有值并尝试从总计中删除当前存在的字符串时,输出成功

private void checkabst_Click(object sender, EventArgs e)
        {
            string[] present1 = new string[listbox_present.Items.Count];
            List<string> present = new List<string> { ""};
            List<string> absent = new List<string>();
            List<string> total = new List<string>();
            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("Select Rfid_Uid From Studetails", con);
                con.Open();
                SqlDataReader sdr = cmd.ExecuteReader();

                while (sdr.Read())
                {
                    total.Add(sdr[0].ToString());
                }
            }
           present = listbox_present.Items.Cast<string>().ToList();

            foreach(string temp in present)
            {
                total.Remove(temp);
            }

            foreach (string temp in total)
            {
                listbox_absent.Items.Add(temp);
            }
        }

过去几天卡在这里。

我认为列表框值在从总列表中删除字符串时会出现问题。

【问题讨论】:

    标签: c# mysql asp.net arrays visual-studio


    【解决方案1】:

    从上面 Ehsan 回答中的 cmets 我不确定你是否知道:

    System.Linq.Enumerable.Distinct
    

    【讨论】:

    • 先生,请检查我是否更新了代码和检索方法。
    【解决方案2】:

    您可以通过Except 方法简单地实现这一点。不需要for循环

    删除以下代码

     bool isfound = false;
            for (int i = 0; i < 3; i++)
            {
                isfound = false;
    
                for (int j = 0; j < present.Length; j++)
                {
                    if (allstd[i] == present[j])
                    {
                        isfound = true;
                    }
    
                }
                if (!isfound)
                {
                    MessageBox.Show(allstd[i]);
                }
    
            }
    

    并添加

    absent = allstd.Except(present).ToArray();
    

    并遍历这些以显示在MessageBox

     foreach (var stud in absent)
            {
                 MessageBox.Show(stud);
            }
    

    只是在OP评论后澄清一下,举一个工作例子

     string[] present =  { "A" , "C" , "D" ,"P"};
     string[] absent = new string[3];
     string[] allstd = { "A", "B", "C" ,"D" , "E" , "P"};           
    
     absent=   allstd.Except(present).ToArray();
    

    absent 将包含 "B""E"

    更新在 OP 的最新代码更新之后。

    尝试用以下方法替换您的方法,并删除拖曳foreach loops

    private void checkabst_Click(object sender, EventArgs e)
        {
            string[] present1 = new string[listbox_present.Items.Count];
            List<string> present = new List<string> { ""};
            List<string> absent = new List<string>();
            List<string> total = new List<string>();
            using (SqlConnection con = new SqlConnection(cs))
            {
                SqlCommand cmd = new SqlCommand("Select Rfid_Uid From Studetails", con);
                con.Open();
                SqlDataReader sdr = cmd.ExecuteReader();
    
                while (sdr.Read())
                {
                    total.Add(sdr[0].ToString());
                }
            }
           present = listbox_present.Items.Cast<string>().ToList();
    
           absent = total.Except(present).ToArray();
           foreach (var stud in absent)
           {
               MessageBox.Show(stud);
           }
        }
    

    【讨论】:

    • 但是我如何检索缺席的值,我需要使用 For 循环还是如何?
    • 没用我再次获得列表框中的所有值absent=allstd.Except(present).toArray(); for(int i=0;i&lt;3;i++) { listbox_absent.items.add(absent[i]); } 再次获得不排除当前学生值的所有值
    • absent 将保存这些值。
    • 然后最后遍历缺席,看看更新的答案
    • 先生,请检查我已经更新了方法和问题仍然无法正常工作!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多