1

私が次のように定義されたクラスを持っているとしましょう

class Object
{
    public int ID { get;set; }
    public string Property { get; set; }

    public override bool Equals(object obj)
    {
        Object Item = obj as Object;
        return Item.ID == this.ID;
    }

    public override int GetHashCode()
    {
        int hash = 13;
        hash = (hash * 7) + ID.GetHashCode();
        return hash;       
    }
}

そして、次のように定義された2つのリスト:

List<Object> List1;
List<Object> List2;

これらの2つのリストには、フィールドが同じである可能性があるオブジェクトが含まれていますが、IDフィールドは同じである場合とPropertyそうでない場合があります。これらのリストのいずれかで、プロパティ"1" "1"`にList1含まれるすべてのオブジェクトと一緒に含まれるすべてのオブジェクトの結果が必要です。結果には、個別の値(個別のID)が含まれている必要があります。List2, with the condition thatfield must be set toif it is set to

たとえば、次のような2つのリストがある場合:

List1 
-----  
ID = 0, Property = "1"
ID = 1, Property = ""
ID = 2, Property = "1"
ID = 3, Property = ""

List2
-----
ID = 1, Property = "1"
ID = 2, Property = ""
ID = 3, Property = ""

次のような結果が必要です。

Result
-------
ID = 0, Property = "1"
ID = 1, Property = "1"
ID = 2, Property = "1"
ID = 3, Property = "" 

現在、次のように機能します。

var Result = List1.Except(List2).Concat(List2.Except(List1));
var Intersection = List1.Intersect(List2).ToList();
Intersection.ForEach(x => {
    x.Property = List1.Single(y => y.ID == x.ID).Property == "1" ? "1" : List2.Single(y => y.ID == x.ID).Property == "1" ? "1" : "";
});

Result = Result.Concat(Intersection);

...しかし、ForEachは非常に遅いです。誰かがより速い方法を提案できますか?

4

2 に答える 2

2
var result = List1.Concat(List2)
                  .GroupBy(o => o.ID)
                  .Select(g => new Object() { 
                                   ID=g.Key,
                                   Property=g.Any(o=>o.Property=="1")?"1":""
                   })
                  .ToList();
于 2012-10-28T12:01:56.613 に答える
1
var result = List1.Concat(List2)
        .OrderByDescending(o => o.Property)
        .GroupBy(g => o.ID)
        .Select(g => g.First())
        .ToList();
于 2012-10-28T12:33:20.423 に答える