Как вычесть один общий список из другого в C # 2.0 - PullRequest
5 голосов
/ 15 февраля 2010

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

Я пытаюсь определить, какой диск был создан после подключения 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 Framework 2.0, поэтому LINQ невозможен.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 15 февраля 2010

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

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;
}
1 голос
/ 13 ноября 2013

Вы можете работать с методом расширения Linq и Insersect , так же, как и с математическим набором.

A = Оригинал.

B = После.

A - (A Пересечение B) = удалено из оригинала B - (вставка B) = новый

var intersect = A.Intersect (B);

var удален = A.Substract (пересекаются); var new = B.Substract (пересекаются)

Надеюсь, это работает для вас.

1 голос
/ 15 февраля 2010

Для небольшого количества элементов цикл 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<K,V> вместо List<T>. (В идеале вы должны использовать HashSet<T>, но это не доступно в версии 2 платформы.)

...