2番目のパラメータIEqualityComparerを使用して、オーバーロードされた関数を探しています。だからあなたの比較者(例:http://www.blackwasp.co.uk/IEqualityComparer.aspx)を作成し、交差/例外で同じ比較者を使用してください。
一般的な部分:おそらく、テンプレート用の共通インターフェースを持つ必要があります。クラスに文字列IDプロパティがあることを示すObjectWithIDあるいは、単にcomparerでdynamicを使用してください(しかし、これは非常に反パターンであると思います。悪い型を使用すると実行時エラーが発生する可能性があるためです)。
また、2つの異なるタイプの2つのコレクションを交差させると、Object(共通の親クラス)のコレクションになります。それからあなたはたくさんのキャスト(反パターン)しなければなりません。私はあなたのテンプレートクラスのための共通の抽象クラス/インターフェイスを作ることをお勧めし、それは動作しています。あなたが戻って要素をキャストする必要がある場合は、キャストが、visitiorパターンを使用しないでください:http://en.wikipedia.org/wiki/Visitor_pattern
例(良い):
static void Main(string[] args)
{
// http://stackoverflow.com/questions/16496998/how-to-copy-a-list-to-another-list-with-comparsion-in-c-sharp
List<Template> listForTemplate = new Template[] {
new Template(){ID = "1"},
new Template(){ID = "2"},
new Template(){ID = "3"},
new Template(){ID = "4"},
new Template(){ID = "5"},
new Template(){ID = "6"},
}.ToList();
List<Template1> listForTemplate1 = new Template1[] {
new Template1(){ID = "1"},
new Template1(){ID = "3"},
new Template1(){ID = "5"}
}.ToList();
var comp = new ObjectWithIDComparer();
var matches = listForTemplate.Intersect(listForTemplate1, comp);
var ummatches = listForTemplate.Except(listForTemplate1, comp);
Console.WriteLine("Matches:");
foreach (var item in matches) // note that item is instance of ObjectWithID
{
Console.WriteLine("{0}", item.ID);
}
Console.WriteLine();
Console.WriteLine("Ummatches:");
foreach (var item in ummatches) // note that item is instance of ObjectWithID
{
Console.WriteLine("{0}", item.ID);
}
Console.WriteLine();
}
}
public class ObjectWithIDComparer : IEqualityComparer<ObjectWithID>
{
public bool Equals(ObjectWithID x, ObjectWithID y)
{
return x.ID == y.ID;
}
public int GetHashCode(ObjectWithID obj)
{
return obj.ID.GetHashCode();
}
}
public interface ObjectWithID {
string ID { get; set; }
}
public class Template : ObjectWithID
{
public string ID { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public string Place { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Country { get; set; }
}
public class Template1 : ObjectWithID
{
public string ID { get; set; }
}
出力:前述のように
Matches:
1
3
5
Ummatches:
2
4
6
Press any key to continue . . .
私は一致と不一致のIDフィールド(すべてではない)のみを取得しています 私はすべてのプロパティが必要です。助けてください! –
すべてのプロパティと比較する場合は、 'IEqualityComparer' –
Ric
を実装する必要があります。すべてのプロパティと比較しません。 1つのプロパティ(ID)と比較し、別のリストのすべてのプロパティを取得する –