如何将其建模为LINQ查询?

时间:2013-10-21 08:54:02

标签: c# .net linq

我有以下课程:

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;}
}

拥有一个List我需要返回一个List,其中包含列表中不同的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语句不太满意。

提前致谢。

5 个答案:

答案 0 :(得分: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();

答案 1 :(得分:3)

您可以使用Tuple课程,它会为您完成所有相关工作:

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所需的全部内容。

答案 2 :(得分:2)

实际上你甚至不需要创建元组(我不喜欢它们用于丑陋的项目名称)来选择不同的值 - 匿名类型有内置的Equals和GetHashCode实现,它们将用于不同的选择:

list.Select(a => new { a.P1, a.P2 })
    .Distinct()
    .Select(x => new Id { Main = x.P1, SubMain = x.P2 });

答案 3 :(得分:0)

答案 4 :(得分:-1)

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

from a in alist
where a.P1 != a.P2
select new Id() { Main = a.P1, SubMain = a.P2 }