如何从比较两个数组中检索不同的字符串值?

时间:2018-01-22 11:02:09

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

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

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

然后我考虑使用foreach循环删除那些ID在列表框中的学生

但是当我将两个列表定义为total并且显示值并尝试从当前删除字符串时n输出成功

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);
            }
        }

过去几天就被困在这里。

问题我认为列表框值在从总列表中删除字符串时遇到了麻烦。

2 个答案:

答案 0 :(得分:0)

您只需使用Except方法即可实现此目的。无需循环

删除以下代码

 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);
       }
    }

答案 1 :(得分:0)

根据您对Ehsan的回答,我不确定您是否知道:

System.Linq.Enumerable.Distinct