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

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 Framework 2.0,因此无法使用LINQ。
谢谢!
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;
}

一种高效的解决方案,但方法名称不正确。它不返回两个序列的交集。 - LukeH
在我看来,这两个答案都是有效的,但由于我的要求,我选择了简单的方法。 - Fueled

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>,但在框架的第二个版本中不可用。)

我选择了这个答案,因为我只需要一次性的东西。如果我需要重复在不同的地方执行此操作,我可能会实现Lee答案中的减法。 - Fueled

1
你可以使用Linq扩展方法中的Subtract和Insersect,就像处理数学集合一样。
A = 原始数据。
B = 处理后的数据。
A - (A 交 B) = 从原始数据中删除
B - (A 交 B) = 新数据
var intersect = A.Intersect(B);
var removed = A.Substract(intersect);
var new = B.Substract(intersect)
希望这对你有用。

4
Linq没有叫做Subtract(或Substract)的方法。我认为你指的是Except - JLRishe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接