我有以下课程:
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语句不太满意。
提前致谢。
答案 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)
看看Enumerable.Except
http://msdn.microsoft.com/en-us/library/system.linq.enumerable.except(v=vs.110).aspx
答案 4 :(得分:-1)
你需要一个简单的linq查询:
from a in alist
where a.P1 != a.P2
select new Id() { Main = a.P1, SubMain = a.P2 }