あなたは非常に効率的にこの問題を解決するためにgroup by
を使用することができます。
var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
あなたに、各グループが同じを持っているすべてのオブジェクトが含まれているグループのシーケンスを与えます指定されたプロパティの値。グループの結果のシーケンスの各グループ内のすべてのアイテムを反復処理するための一例として、
、あなたはこのような何か行うことができます。これは、各プロパティのタイプはIEquatable<T>
とGetHashCode()
を実装することを前提としていること
foreach (var group in grouped)
{
foreach (var item in group)
{
// Do something with item
}
}
注意を。あなたは、以下の@BertPersynによる可能性が言及したようPLINQに
を使用して
1A, 1B, 1C
2A, 2B, 2C
3A, 3B, 3C
可能な最適化:出力上記
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
class Data
{
public string Name { get; set; }
public int Property1 { get; set; }
public int Property2 { get; set; }
public int Property3 { get; set; }
public int Property4 { get; set; }
public int Property5 { get; set; }
public int Property6 { get; set; }
public int Property7 { get; set; }
public int Property8 { get; set; }
public int Property9 { get; set; }
public int Property10 { get; set; }
}
class Program
{
static void Main(string[] args)
{
List<Data> myClassList = new List<Data>
{
new Data {Name = "1A", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1B", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "1C", Property2 = 1, Property4 = 1, Property8 = 1, Property10 = 1},
new Data {Name = "2A", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2B", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "2C", Property2 = 2, Property4 = 2, Property8 = 2, Property10 = 2},
new Data {Name = "3A", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3B", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
new Data {Name = "3C", Property2 = 3, Property4 = 3, Property8 = 3, Property10 = 3},
};
var grouped =
from item in myClassList
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
foreach (var group in grouped)
{
Console.WriteLine(string.Join(", ", group.Select(item => item.Name)));
}
}
}
}
例:ここでは
はコンパイル可能な例ですおそらくPLINQを使ってこれをスピードアップします。
はそれを行うには、単に(.AsParallel()
の追加に注意してください)grouped
を生成するには、次の使用: var grouped =
from item in myClassList.AsParallel()
group item
by new {item.Property2, item.Property4, item.Property8, item.Property10};
を判断するには、これは実際に物事をスピードアップした場合、あなたには、いくつかのタイミングを行うことが不可欠です。
'FindAll'の代わりに' Where() 'を使用 – geo
この大きな一覧はどこから来ますか? SQLデータベースの場合は、クエリに良いWHERE句を追加する方が効率的かもしれません。また、リストが注文されていれば役立つかもしれません - あなたはその注文を悪用するコードを書き直すことができます。 –
@geo:私はすでに同様の結果でそれをしたと思う。 – flo