3

Person オブジェクトのリストがあります。

List<PersonData> AllPersons

このリストから、特定のプロパティに基づいて複製されたすべての人物オブジェクトが必要です。

例、このコードは Id に基づいてすべての重複を提供します

var duplicateKeys = AllPersons.GroupBy(p => p.Id).Select(g => new { g.Key, Count = g.Count() }).Where(x => x.Count > 1).ToList().Select(d => d.Key);
    duplicates =  AllPersons.Where(p => duplicateKeys.Contains(p.Id)).ToList();

p.Id の部分を動的にすることはできますか?

ユーザーが構成ファイルで一意の列を指定し、次のように読み取った場合の意味:

string uniqueColumn = "FirstName";

その機能を追加するためにクエリをどのように構成できますか?

よろしく。

4

2 に答える 2

1

リフレクションを使用してそれを実現できます。

List<PersonData> AllPersons = new List<PersonData>()
{
    new PersonData { Id = 1, FirstName = "Tom" },
    new PersonData { Id = 2, FirstName = "Jon" },
    new PersonData { Id = 3, FirstName = "Tom" }
};

string uniqueColumn = "FirstName";

var prop = typeof(PersonData).GetProperty(uniqueColumn);

var duplicateKeys = AllPersons.GroupBy(p => prop.GetValue(p, null))
                              .Select(g => new { g.Key, Count = g.Count() })
                              .Where(x => x.Count > 1)
                              .Select(d => d.Key)
                              .ToList();

var duplicates = AllPersons.Where(p => duplicateKeys.Contains(prop.GetValue(p, null))).ToList();

duplicatesFirstName == "Tom"クエリの実行後に2 つの要素があります。

于 2013-03-05T07:03:35.697 に答える
0

Dynamic LINQまたはPredicateBuilderを調べることをお勧めします。

于 2013-03-05T07:03:53.390 に答える