-1

以下のような質問があります。LIST に項目が含まれているにもかかわらず、 ?:部分が常に false 値を返す理由は誰にもわかります。または、このクエリを作成するより良いアイデアがある場合は、ここに返信してください。ありがとう。

List EList = new List();
EList.Add(new EmployeeInfo(1, "a1", "b1"));
EList.Add(new EmployeeInfo(2, "a2", "b2"));
List OList = new List();
OList.Add(new EmployeeInfo(1, "a1", "b1"));
OList.Add(new EmployeeInfo(2, "a2", "b2"));
OList.Add(new EmployeeInfo(3, "aa2", "bb2"));

var results = (
    from e in b
    select new
    {
        Id = e.ID,
        Name = e.Name,
        Email = e.Email,
        IS_Elist = (EList.Contains(e))?true:false,
        IS_Olist = (OList.Contains(e)) ? true : false,
    }
    ).ToList();
4

3 に答える 3

2

まず、クエリを単純化できます。expression ? : true : falseこれは just と同等でexpressionあり、次の結果が得られます。

var results = b.Select(e => new
                            {
                                Id = e.ID,
                                Name = e.Name,
                                Email = e.Email,
                                IS_Elist = EList.Contains(e),
                                IS_Olist = OList.Contains(e)
                             })
               .ToList();

trueからのアイテムがまたはbに含まれている場合、これは確実に生成されます。常に取得する場合は、 からのアイテムが含まれていないことを意味します。おそらく参照の比較を行っていることを覚えておいてください。EListOListfalseEListOListb

new EmployeeInfo(1, "a", "b") == new EmployeeInfo(1, "a", "b")

通常お譲り致しますfalse

私はあなたが実際に比較することを意図したと思いますID.

var results = b.Select(e => new
                            {
                                Id = e.ID,
                                Name = e.Name,
                                Email = e.Email,
                                IS_Elist = EList.Any(x => x.ID == e.ID),
                                IS_Olist = OList.Any(x => x.ID == e.ID)
                             })
               .ToList();

IEquatable<T>別の解決策は、 onEmployeeInfoまたはオーバーライドEquals()GetHashCode()および等値演算子を実装することです。すべての実装で一貫した結果が得られるように注意する必要があります。そうしないと、たとえばObject.Equals()、等値演算子が異なる結果をもたらすなど、多くの混乱を招くことになります。

于 2012-12-18T00:03:57.417 に答える
0

EmployeeInfo に対して期待どおりに等価性チェックが動作していない可能性があります。確認するには、上に投稿したスニペットの下部でこれを試して、true が返されるかどうかを確認してください。

var is_olist = OList.Contains(new EmployeeInfo(1, "a1", "b1"));

これが false を返す場合は、インスタンスを比較するために、より単純でありながら一意のもの (ID メンバーなど) を使用することを検討するか、または EmployeeInfo に equals を自分で実装する必要があります。

于 2012-12-18T00:00:47.067 に答える
0

Equals と Equality == 演算子を EmployeeInfo クラスに実装します。

Equals メソッドの実装

Equals および等値演算子 (==) の実装に関するガイドライン

于 2012-12-18T00:01:01.523 に答える