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リムーバブル ドライブ文字の文字列のリストを返します。私のアイデアは、デバイスが接続される前にリムーバブル ドライブのリストを取得し、接続に別のリストを取得することでした。最初のリストの内容を 2 番目のリストから削除すると、接続されたばかりのドライブが残ります (通常は、唯一)。

しかし、あるリストを別のリストから「差し引く」簡単な方法が見つかりません。誰でも解決策、または私がやろうとしていることを達成するためのより良い方法を提案できます.

: プロジェクトは .NET Framework 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>コレクションに多くの要素がある場合は、ではなくを使用して検索をより効率的にすることができますList<T>。(理想的には を使用しますHashSet<T>が、フレームワークのバージョン 2 では使用できません。)

于 2010-02-15T14:55:55.537 に答える