3

私は次のクラスを持っています:

public class A
{
    public string P1 {get;set;}
    public string P2 {get;set;}
    public string P3 {get;set;}
    public string P3 {get;set;}
}

public class Id
{
    public string Main {get;set;}
    public string SubMain {get;set;}
}

リストを持つ私は、リスト内で異なるすべてのペア P1 - P2 を含むリストを返す必要があります。

したがって、リストにある場合:

 P1 = "A" - P2 "B"
 P1 = "A" - P2 "C"
 P1 = "B" - P2 "B"
 P1 = "A" - P2 "B"

次のような 3 つの ID を持つリストを返す必要があります。

 Main = "A" - SubMain "B"
 Main = "A" - SubMain "C"
 Main = "B" - SubMain "B"

これは 1 つの LINQ クエリだけで可能ですか? はいと言うでしょうが、Select ステートメントにはあまり慣れていません。

前もって感謝します。

4

5 に答える 5

3

最初に を作成しIEqualityComparer<A>、次に:

class AP1P2Comparer : IEqualityComparer<A>
{

    public bool Equals(A a1, A a2)
    {
        return a1.P1 == a2.P1 && a1.P2 == a2.P2
    }


    public int GetHashCode(A a)
    {
       unchecked 
       {
         int hash = 17;
         hash = hash * 23 + a.T1.GetHashCode();
         hash = hash * 23 + a.T2.GetHashCode();
         return hash;
       }
    }

}
//...
var result = list.Distinct(new AP1P2Comparer())
                 .Select(a => new Id { Main = a.P1, SubMain = a.P2 })
                 .ToList();
于 2013-10-21T08:58:46.253 に答える
2

実際には、個別の値を選択するためにタプルを作成する必要さえありません (私は醜いアイテム名には好きではありません)。匿名型には、個別の選択に使用される組み込みの Equals および GetHashCode 実装があります。

list.Select(a => new { a.P1, a.P2 })
    .Distinct()
    .Select(x => new Id { Main = x.P1, SubMain = x.P2 });
于 2013-10-21T09:24:57.633 に答える
0

Enumerable.Except を見てください。

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx

于 2013-10-21T12:18:51.960 に答える