首先,我很可能会以错误的方式接近我的问题,在这种情况下,我很乐意接受替代方案。
我想要实现的是检测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。
谢谢!
答案 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)
希望这适合你。