В первую очередь, очень хорошо могло случиться так, что я приближаюсь к своей проблеме неправильный путь, в этом случае я с удовольствием принял бы альтернативы.
То, чего я пытаюсь достигнуть, должно обнаружить, какой диск был создан после того, как 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.
Спасибо!
Для небольшого количества элементов, тогда цикл 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 платформы.)
Общий способ сделать это - добавить все элементы из исходной коллекции в словарь, а затем удалить элементы из другой коллекции:
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;
}