Member 13479861 Ответов: 1

Как получить различные строки из сравнения двух массивов?


Я хочу получить имена отсутствующих студентов из базы данных sql. У меня есть список, в котором я представил данные Rfid студента (что-то вроде 42 39 A0 11), я сохранил данные студента вместе с Rfid в базе данных как тип данных nvarchar(1500).

Используя текущий идентификатор студента в списке, я хочу получить имя отсутствующего студента в массиве.

Я использовал не в том состоянии, в котором, но я не был в состоянии восстановить

Затем я подумал о том, чтобы использовать циклы for для сопоставления get the students, ID которых не был в списке

Но все равно я теряю ценности и не получаю надлежащего удостоверения отсутствующего студента.


<pre>    private void checkabst_Click(object sender, EventArgs e)
    {
        string[] present = new string[3];
        string[] absent = new string[3];
        string[] allstd = new string[3];
        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());
                }
allstd=total.toArray();

              for(int i=0;i<listbox_present.Items.Count;i++)
            {
                present[i] = listbox_present.Items[i].ToString();

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

            }


Застрял здесь с последних нескольких дней.

Я получаю настоящее время, а также отсутствующие студенческие удостоверения в messagebox.

Что я уже пробовал:

Я попробовал это сделать, используя Concat массивов и удаление дубликатов, но это тоже не сработало.

[no name]

Я вижу, что вы ничего не храните в отсутствующем массиве.Следовательно, ваш первоначальный вопрос "я хочу получить отсутствующие имена студентов из базы данных sql" остается невыполненным.Во-вторых, пожалуйста, не используйте select query в строке.Это делает нас уязвимыми к SQL-инъекциям.пожалуйста, используйте параметризованный запрос.

Richard MacCutchan

Запрос не содержит никаких параметров.

Richard MacCutchan

Захватите все Rfid-номера в список. Для каждого числа, если оно существует в списке "настоящее", удалите его из списка. Когда этот цикл завершится, то у вас останется список отсутствующих студентов.

1 Ответов

Рейтинг:
5

OriginalGriff

Если ты имеешь в виду
1) Таблица Studetails содержит все идентификационные номера RFID для студентов.
2) в listbox_present содержит идентификатор RFID для студентов, которые здесь присутствуют.
3) Вы хотите найти все идентификационные номера RFID, которые находятся в таблице, но не в списке.

Тогда ваш код начинается хорошо: total должен содержать всех студентов
Если предположить, что ваш listbox прав - а я не могу сказать, я не вижу его, - то Present также будет правильным (хотя я бы использовал другой список<T> вместо массива фиксированного размера).
Самое простое решение-сделать петлю через present, и список вызовов.удалить, чтобы вывести каждого присутствующего студента.

После цикла у вас есть все пропавшие студенты в общей сложности.
Это довольно простая вещь - при условии, что вы вызываете метод Remove - и простой foreach on present я сделаю это за тебя.

Дайте ему попробовать: если он не выглядит так, как будто он работает, используйте отладчик, чтобы проверить содержимое total и present перед тем как войти в петлю, сделайте шаг вперед, глядя на то, что происходит.


Member 13479861

Я использовал методы concat / copyto, чтобы получить все детали в одном массиве, и попытался получить различные значения, но это не сработало

OriginalGriff

Попробуйте то, что я предложил - заставьте его работать с базовыми методами, и вы можете "обновить" более сложные методы позже.

Member 13479861

string[] present1 = новая строка[listbox_present.Предметы.Рассчитывать];
/*[] отсутствует = новая строка[3];
string[] allstd = новая строка[3];*/
Список<строка> в подарок = новый список<строка&ГТ;();
List<string> absent = новый список<string>();
List<string> total = новый список<string>();
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("Select Rfid_Uid From Studetails", con);
против.Открыть();
SqlDataReader sdr = cmd.Метода executereader();

в то время как (sdr.Read())
{
весь.Добавить(sdr[0].Метод toString());
}
for (int i = 0; i < listbox_present.Предметы.Граф; i++)
{
present1[i] = listbox_present.Элементы[я].Метод toString();
}
настоящее=present1.Список();
//отсутствует = всего.Кроме(настоящего).Список();
foreach (строка temp1 всего)
{
foreach(строка temp2 в настоящем времени)
{
если(temp1==temp2)
{
итого.удалить(temp2);
}
}

}

foreach(строка temp3 в общей сложности)
{
Ящик для сообщений.Показать(temp3);
}

Я получаю все значения total.remove не работает, я не знаю, в чем ошибка. я сделал так, как вы предлагали.

OriginalGriff

Вы не можете сделать это таким образом. Вы перебираете total - что вам не нужно - и одновременно изменяете total: это недопустимо и вызовет исключение "коллекция изменена".

Подумайте об этом, как о попытке сосчитать монеты: у вас есть большая куча монет, которые вы пытаетесь сосчитать: 1, 2, 3, 4, ... 753 и кто-то наугад хватает пригоршню. Вы их уже сосчитали? Все они? Некоторые из них? Ни одного? Вы не знаете, поэтому вам придется начинать все сначала. И опять же, ваша пара захватывает какую-то часть пути. Это то же самое: когда вы пытаетесь изменить коллекцию во время ее итерации, система по понятным причинам расстраивается и выдает исключение.

Вам не нужно перебирать общее вообще - просто над теми, кто присутствует, и удалить их из общего. Те, кто остался, - это отсутствующие.

Member 13479861

Эй @OriginalGriff я уже пробовал это сделать

foreach(string temp in present)
{
общая.удалить(темп);
}

Этот код работал для списков с я определил строки, которые я получил правильный вывод, но когда я пытаюсь сделать то же самое с содержимым списка и содержимым базы данных, он не работает, получая все значения.
Я думаю, что есть проблема в значениях, которые я получаю из списка

for(int i=0;i<listbox_present.Предметы.Граф;i++)
{
подарок.Добавить(listbox_present.items[i].toString());
}

пожалуйста, помогите!!!!

OriginalGriff

Поэтому используйте отладчик, чтобы точно посмотреть, что представляют собой строки, которые вы добавляете в "present" - я не могу сделать это за вас, я не могу запустить ваш код!

Member 13479861

Наконец-то сработало.Проблема заключалась в пробелах, которые отправлялись от rfid-считывателя идентификатор был отправлен как "9A 16 45 7B" пространство между ними давало проблему в сопоставлении строк.Thsnk you @OriginalGrill за вашу обширную помощь.....

OriginalGriff

Всегда пожалуйста!