Frank R. Haugen Ответов: 1

C# сравнение и извлечение данных из списка 2 & lt; & gt;


Мне трудно структурировать свой код, чтобы делать то, что я хочу.

Цель состоит в том, чтобы очистить базу данных инвентаризации и заменить ее только теми компьютерами, которые использовались в прошлом году

Я сравниваю 2 списка компьютеров, один из Active Directory и один из базы данных инвентаризации. Я сделал таблицы в List< gt; s, и моя идея состояла в том, что "действительный" список компьютеров в Active Directory будет проверяться пункт за пунктом по всему инвентарному списку, а затем, если будет совпадение, информация из обоих списков будет объединена в третий список. Я не получаю такого результата

Мой код
int i = 0;
foreach (MachineAD ADmachine in machinesAD)
{
    foreach (Machine machine in machines)
    {
        if (ADmachine.Name.Contains(machine.BarCode))
        {
            machinesUnified.Add(new MachineUnified() { IDad = ADmachine.ID, NameFromAD = ADmachine.Name, NameFromInventory = machine.BarCode });
            Console.WriteLine(machinesUnified[i].NameFromAD);
            i++;
        }
    }
}

Выведите выдержку, (это 1700 строк по сравнению с 4500, что приводит к такому шаблону):
...033333
033333
033333
033333
033333
033333
033333
033333
033333
033333
033333
033333
033333
033435
033435
033435
033435
033435
033435
033435
033435
033435
033435
033435
033435
033435
032673
032673
032673
032673
032673
032673
032673
032673
032673
032673
032673
032673
032673
034567
034567
034567
034567
034567
034567
034567
034567
034567
034567
034567
034567
034567...


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

Чтение документации, сообщений на форуме, статей о перекрестных ссылках списков и т. д.

Maciej Los

Кажется, вы хотите сравнить два совершенно разных объекта. Итак, вы должны реализовать Метод равных чтобы иметь возможность сравнивать эти объекты.

Frank R. Haugen

Мне нужен x. содержит()

Maciej Los

Нет, не знаешь. Все, что вам нужно, - это определить метод сравнения объектов. См. ответ OriginalGriff.

Frank R. Haugen

Да, я это сделал, и он не изменил мой код

1 Ответов

Рейтинг:
12

OriginalGriff

Если я сделаю фиктивную настройку и протестирую ваш код:

public class MachineAD
    {
    public string Name;
    public int ID;
    }
public class Machine
    {
    public string BarCode;
    }
public class MachineUnified
    {
    public int IDad;
    public string NameFromAD;
    public string NameFromInventory;
    }
private void myButton_Click(object sender, EventArgs e)
    {
    List<MachineAD> machinesAD = new List<MachineAD>();
    machinesAD.Add(new MachineAD() { Name = "M1", ID = 33333 });
    machinesAD.Add(new MachineAD() { Name = "M2", ID = 33435 });
    machinesAD.Add(new MachineAD() { Name = "M3", ID = 32673 });
    List<Machine> machines = new List<Machine>();
    machines.Add(new Machine() { BarCode = "1" });
    machines.Add(new Machine() { BarCode = "3" });
    List<MachineUnified> machinesUnified = new List<MachineUnified>();
    int i = 0;
    foreach (MachineAD ADmachine in machinesAD)
        {
        foreach (Machine machine in machines)
            {
            if (ADmachine.Name.Contains(machine.BarCode))
                {
                machinesUnified.Add(new MachineUnified() { IDad = ADmachine.ID, NameFromAD = ADmachine.Name, NameFromInventory = machine.BarCode });
                Console.WriteLine(machinesUnified[i].NameFromAD);
                i++;
                }
            }
        }
    }

Тогда я получаю два ряда:
33333, M1, 1
32673, M3, 3
Чего я и ожидал. Чтобы получить больше строк, мне нужно изменить штрих-код так, чтобы он представлял собой подмножество нескольких имен машин:
List<MachineAD> machinesAD = new List<MachineAD>();
machinesAD.Add(new MachineAD() { Name = "M1", ID = 33333 });
machinesAD.Add(new MachineAD() { Name = "M2", ID = 33435 });
machinesAD.Add(new MachineAD() { Name = "M3", ID = 32673 });
List<Machine> machines = new List<Machine>();
machines.Add(new Machine() { BarCode = "M" });
machines.Add(new Machine() { BarCode = "3" });

Тогда я получаю 4 строки:
33333, M1, M
33435, M2, M
32673, M3, M
32673, M3, 3
Итак...я бы начал с просмотра ваших данных и, в частности, того, что находится в поле штрих - кода-если какой-либо из них "нечетный", то они могут соответствовать довольно многим вашим именам, а не только одному, что вызовет вашу проблему.


Maciej Los

5! и еще один за усилия!

Frank R. Haugen

Ух ты, Спасибо, что потратили на это столько усилий!

Это действительно помогло узнать, что код был в основном звуковым. Увидев, как работает ваш код, я сделал несколько "линий записи" и упустил одну фундаментальную вещь:
Вырваться из глубочайшей петли, когда "если" было правдой. Очень нубская ошибка

OriginalGriff

"Очень нубская ошибка" - и мы все совершаем ее даже сейчас... :)