6

首先,很可能是我以错误的方式处理我的问题,在这种情况下,我很乐意接受替代方案。

我想要实现的是检测 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。

谢谢!

4

3 回答 3

3

执行此操作的一般方法是将源集合中的所有项目添加到字典中,然后删除另一个集合中的项目:

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;
}
于 2010-02-15T15:10:00.823 回答
1

对于少量元素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>如果集合有很多元素,那么您可以通过使用 a而不是 a来提高查找效率List<T>。(理想情况下,您会使用 a HashSet<T>,但这在框架的版本 2 中不可用。)

于 2010-02-15T14:55:55.537 回答
1

您可以使用 Linq 扩展方法的SubtractInsersect,就像使用数学集一样。

A = 原创。

B = 之后。

A - (A Intersect B) = 从原来的 B 中移除 - (A insect B) = new

var intersect = A.Intersect(B);

var removed = A.Substract(intersect); var new = B.Substract(相交)

希望这对你有用。

于 2013-11-13T19:30:16.367 回答