我想从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);
}
}
过去几天就被困在这里。
问题我认为列表框值在从总列表中删除字符串时遇到了麻烦。
答案 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”
更新。
尝试使用以下方法替换您的方法并移除拖曳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