如何在C#2.0中从另一个中减去一个通用列表

时间:2010-02-15 14:52:36

标签: c# windows c#-2.0 device-driver generic-list

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

我想要实现的是检测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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

对于少量元素,带Contains调用的foreach循环应该可以解决问题:

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版中不可用。)

答案 2 :(得分:1)

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

A =原创。

B =之后。

A - (A相交B)=从原始中删除 B - (A insersect B)= new

var intersect = A.Intersect(B);

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

希望这适合你。