Как вычесть один универсальный список от другого в C#2.0

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

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

Вот упрощенный рабочий процесс:

// Get list of removable drives before user connects the USB cable
List<string> listRemovableDrivesBefore = GetRemovableDriveList();

// Tell user to connect USB cable
...

// Start listening for a connection of a USB device
...

// Loop until device is connected or time runs out
do
{
    ...
} while

// Get list of removable drives after USB device is connected
List<string> listRemovableDrivesAfter = GetRemovableDriveList();

// Find out which drive was created after USB has been connected
???

GetRemovableDriveList возвращает список строк съемных букв дисков. Моя идея состояла в том, чтобы получить список съемных дисков, прежде чем устройство будет подключено, и другой список после того, как это соединено, и что путем удаления содержания первого списка от второго, меня оставили бы с дисками, которые были просто подключены (обычно только один).

Но я не могу найти простой способ "вычесть" один список от другого. Любой мог предложить решение или даже лучший способ достигнуть того, что я пытаюсь сделать.

Примечание: проект предназначается для платформы.NET 2.0, таким образом, не возможный LINQ.

Спасибо!

5
задан Dave Mateer 26 June 2011 в 08:01
поделиться

2 ответа

Для небольшого количества элементов, тогда цикл foreach с вызовом Contains должен помочь:

List<string> listRemovableDrivesBefore = GetRemovableDriveList();
// ...
List<string> listRemovableDrivesAfter = GetRemovableDriveList();

List<string> addedDrives = new List<string>();
foreach (string s in listRemovableDrivesAfter)
{
    if (!listRemovableDrivesBefore.Contains(s))
        addedDrives.Add(s);
}

Если в коллекции много элементов, то вы можете сделать больше поисков эффективен за счет использования Dictionary , а не List . (В идеале вы должны использовать HashSet , но это недоступно в версии 2 платформы.)

1
ответ дан 14 December 2019 в 19:11
поделиться

Общий способ сделать это - добавить все элементы из исходной коллекции в словарь, а затем удалить элементы из другой коллекции:

public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other)
{
    return Subtract(source, other, EqualityComparer<T>.Default);
}

public static IEnumerable<T> Subtract<T>(IEnumerable<T> source, IEnumerable<T> other, IEqualityComparer<T> comp)
{
    Dictionary<T, object> dict = new Dictionary<T, object>(comp);
    foreach(T item in source)
    {
        dict[item] = null;
    }

    foreach(T item in other)
    {
        dict.Remove(item);
    }

    return dict.Keys;
}
3
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: