0

さて、MasterTagList と FoundTagList の 2 つのリストがあります。マスター リストは、どのタグを検索するかを事前に設定します。見つかったリストは、リーダーが実際に見つけたタグで構成されています。私がやろうとしているのは、見つかったタグ リストのどこにもなかった MasterTagList 内のアイテムを特定することです。つまり、それらは完全に存在しません。

Except() メソッドを使用しようとしましたが、何らかの理由で、項目が正確な順序になっていない場合、すべての項目がまだ欠落していると表示されます。

次のようなコードも試しました。

List<string> missing = new List<string>();
foreach (string T in MasterTagList)
{
    if (!FoundTagList.Contains(T))
    {
        missing.Add(T);
    }
}

欠落している新しいリストには、順序に関係なく、MasterTagList にあるが FoundTagList にはないすべてのアイテムが表示されるはずだと思います。私は決して C# の専門家ではないので、何かを見逃しているかもしれません。

このコードを変更して機能させる方法があるかどうか、または順序に関係なく、欠落している要素を見つける方法が他にあるかどうかを知りたいだけです。

前もって感謝します!

編集:私が言ったように、私はここで提案されている他のすべてのオプションを試しました. 私の Except() インスタンスは次のようになりました。

List<string> missing = MasterTagList.Except(FoundTagList).ToList;

それでも、プログラムを実行すると、欠落しているリストは常に MasterTagList と同じになります。

解決済み: もともとリストに追加していた方法に何か問題があったに違いないことがわかりました。したがって、各リストの要素は必ずしも同一ではありませんでした。戻ってリストに追加する方法を修正したところ、プログラムは完全に機能しています。提案してくださった皆様、ありがとうございました!

4

3 に答える 3

1

これは、Except メソッドを使用すると非常に簡単です。

List<string> missing = MasterTagList.Except(FoundTagList).ToList();

編集

これは以下で確認できます。リストの順序は重要ではないことに注意してください。それでも空のリストが生成されます (欠落はありません)。

List<string> Master = new List<string>()
    { "a", "b", "c", "d", "e", "f", "g", "h" };

List<string> Found = new List<string>() 
    { "g", "d", "e", "h", "a", "b", "c", "f" };

List<string> missing = Master.Except(Found).ToList();

Console.WriteLine(missing.Count); //Prints 0
于 2013-06-14T16:42:52.477 に答える
0

リストの代わりにセットを使用します。セットは、(「Equals」メソッドまたは別の等値比較子に従って) コレクション内に一度に存在する値の単一のインスタンスのみを許可します。

また、セットには順序がないため、「Except」メソッドは正しく機能します。

http://msdn.microsoft.com/en-us/library/bb359438.aspx

セットを使用すると、追加の利点も得られます。文字列を追加する前に、見つかったタグ リストに文字列が既に存在するかどうかを確認する必要はありません。既存のアイテムをセットに追加しようとしても、何も起こりません。HashSet は、ハッシュテーブルを使用して既存のアイテムをすばやく見つけるため、これにも非常に効率的です。

于 2013-06-14T17:14:47.377 に答える
0
List<string> missing = MasterTagList.Where(s => !FoundTagList.Contains(s)).ToList();
于 2013-06-14T16:38:33.317 に答える