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"

这是否可能只使用一个 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 回答
3

您可以使用Tuple类,它将为您完成所有关于 distincts 的工作:

myList.Select(a => Tuple.Create(a.P1, a.P2))
      .Distinct()
      .Select(tuple => new Id() { Main = tuple.Item1, SubMain = tuple.Item2 } )
      .ToList();

优点是 Tuple 类已经覆盖了 Equals、GetHashCode 等成员,这些都是对集合执行 Distinct 所需的。

于 2013-10-21T08:59:52.547 回答
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 回答
-1

你需要一个简单的 linq 查询:

from a in alist
where a.P1 != a.P2
select new Id() { Main = a.P1, SubMain = a.P2 }
于 2013-10-21T09:03:25.460 回答