1

C# V4List<type1> L1には 2 つの一般的な Lists がありますList<type2> L2

私の問題: type1 には「key1」という属性があり、type2 には「key2」という属性があります。L1 と L2 を key1 = key2 の一意のリストにマージしたいと考えています。

両方のクラスの属性がわからないため、これらを動的な方法でマージする必要があります。各タイプの最初の属性が主キーであることだけはわかっています。

4

2 に答える 2

0
var foo = (from type1 in list1
           join type2 in list2 on type1.Id equals type2.Id
           select new {type1, type2}).ToList();
于 2013-04-03T01:22:30.727 に答える
0

「属性」と言うと、プロパティまたはフィールドのいずれかを参照していると思います。これは紛らわしく、まったく別のことを意味するため、「属性」を使用しないでください。

[Attribute]
class type1
{
  public int Field;

  public int Property { get; set; }
}

したがって、type1 と type2 があり、クラスの最初のフィールドまたはプロパティに基づいて、それらを 1 つのリストに結合したいとします。プロパティの名前を知っている場合、最も簡単な実装はダイナミクスを使用することです (Prop1 および Prop2 プロパティ名を想定):

var foo = 
(from type1 in list1
 join type2 in list2 on ((dynamic)type1).Prop1 equals ((dynamic)type2).Prop2
 select new {type1, type2}).ToList();

これは当てはまらず、クラスで「最初の」フィールドまたはプロパティを選択したいので、唯一の方法はリフレクションを使用することです。クラスにプロパティのみ (またはフィールドのみ) があることがわかっている場合は、単純な実装を使用できます。

var t1 = typeof(type1);
var t2 = typeof(type2);

//replace with .GetFields() if neccessary
var p1 = t1.GetProperties()[0]; // find first declared property of type1
var p2 = t2.GetProperties()[0]; // find first declared property of type2

var foo = (from obj1 in list1
       join obj2 in list2 on p1.GetValue(obj1,null) equals p2.GetValue(obj2,null)
       select new {obj1, obj2}).ToList();

クラスでフィールドとプロパティが混在している場合、FindMembers(MemberTypes.Field|MemberTypes.Property...)を使用してすべてのメンバーを一覧表示できますが、この方法には問題があります。フィールドは常にクラスの先頭に再配置されますが、フィールドは次の場合、F1 は常にクラスの最初のメンバーとして返されます (GetFields() は F1、F2、および GetProperties - P1,this[] を返します)。

class A
{
  public int P1 { get;set;}
  public int F1;
  public int this[int x] { get{return x;} set {} }
  public int F2;
}

また、このアプローチには他にも問題があります。

  • 最初のプロパティがインデクサーの場合はどうなりますか? (int this[..] 上記の例)
  • 最初のフィールド/プロパティによって返されるオブジェクトが Equals のオーバーロードを実装していない場合はどうなりますか?
  • 最初のプロパティがゲッターを実装していない場合 (まれですが、可能性があります)? 等

そして一般的に、この設計 (フィールド/プロパティ名を知らず、クラス内の相対的な位置に依存する場合) は悪いと見なされます。MSDNの引用: ... GetMembers メソッドは、アルファベット順や宣言順など、特定の順序でメンバーを返しません。メンバーが返される順序はさまざまであるため、コードはその順序に依存してはなりません。

于 2013-04-03T20:32:31.767 に答える