。外側の鍵セレクタ、インナーキーセレクタと結果セレクタ -
実際Join
方法3式(のfuncs)を必要とします。同じタイプの2つの列挙型を結合したいので、外側と内側のキーセレクタは同じものになります。
プロパティの数が7以上のものではありませんならば、我々はキーとしてTuple<>
使用することができます。ここでは、動的なセレクタを構築することができる方法です。
static Func<T, object> CreateSelector<T>(IEnumerable<string> propertyNames)
{
var sourceType = typeof(T);
var parameter = Expression.Parameter(sourceType, "e");
var properties = propertyNames.Select(name => Expression.PropertyOrField(parameter, name)).ToArray();
var selector = Expression.Lambda<Func<T, object>>(
Expression.Call(typeof(Tuple), "Create", properties.Select(p => p.Type).ToArray(), properties),
parameter);
return selector.Compile();
}
その後、我々は、(お好みのいくつかのトップレベルのpublic staticクラスで両方の方法を入れて)、それを使用しているヘルパーメソッドを作成することができます。
public static IEnumerable<Tuple<T, T>> Join<T>(this IEnumerable<T> left, IEnumerable<T> right, IEnumerable<string> propertyNames)
{
var keySelector = CreateSelector<T>(propertyNames);
return left.Join(right, keySelector, keySelector, Tuple.Create);
}
class Product
{
public string ProductName { get; set; }
public string ProductCode { get; set; }
}
List<Product> list1 = ...;
List<Product> list2 = ...;
var result = list1.Join(list2, new [] { "ProductName", "ProductCode" });
動的列のlistProductxとlistProductx2に参加したいとおっしゃいますか? – sr28
@ sr28はい...とにかくダイナミックな表現を作成しますか? – Pradu
まだ問題が解決しない場合は、listProductxクラスを表示して、一致する単語を説明してください。 –