1
class Program
{
    static void Main(string[] args)
    {
        List<string> aList = new List<string>();
        List<string> bList = new List<string>();
        List<string> answerList = new List<string>();
        aList.Add("and");
        aList.Add("and");
        aList.Add("AND");
        aList.Add("And");
        aList.Add("not");
        aList.Add("noT");
        bList.Add("NOt");
        answerList = aList.Except(bList, StringComparer.InvariantCultureIgnoreCase).ToList();

        foreach (var word in answerList)
        {
            Console.WriteLine(word);
        }
    }

上記のプログラムの予想される動作は、aList内の "not"の出現をすべて削除し、{and、and、AND、And}を返すことです。「StringComparer.InvariantCultureIgnoreCase」は「and」という単語の重複をすべて削除し、answerListに{and}が1つだけ返されているようです。

4

2 に答える 2

1

(強調鉱山)のドキュメントExcept()から:

デフォルトの等値比較子を使用して値を比較することにより、2 つのシーケンスの差集合を生成します。

したがって、setExcept()を返します。つまり、各文字列を最大 1 回返します。大文字と小文字を区別しないように指示しているため、取得している出力が得られます。

これを回避するには、次のようなセットで動作しないメソッドを使用しますWhere()

answerList = aList.Where(
    a => !blist.Contains(a, StringComparer.InvariantCultureIgnoreCase))
    .ToList();

このアプローチは、 (O( a + b ))と比較すると(O( a · b )) 遅いですが、短いシーケンスでは問題になりません。Except()

于 2013-02-02T01:44:33.770 に答える