我有问题!
我有一个
List <List<Class>> L = new List<List<Class>>();
其中Class包含
IDLinea
Posizione
等等......
我希望有一个不同的List<List<Class>>
没有相同行的对象。
例如:
List <List<Class>> L = new List<List<Class>>();
var A = new List<Class>();
Class C = new Class();
C.IDLinea = 1;
C.Posizione = 5;
A.Add(C);
C = new Class();
C.IDLinea = 2;
C.Posizione = 1;
A.Add(C);
L.Add(A);
var B = new List <Class>();
C = new Class();
C.IDLinea = 1;
C.Posizione = 3;
B.Add(C);
C = new Class();
C.IDLinea = 2;
C.Posizione = 1;
B.Add(C);
L.Add(B);
var D = new List <Class>();
C = new Class();
C.IDLinea = 4;
C.Posizione = 1;
D.Add(C);
C = new Class();
C.IDLinea = 2;
C.Posizione = 4;
D.Add(C);
L.Add(D);
所以我想要 A和D
我希望我需要的是清楚的。
感谢。
答案 0 :(得分:3)
根据您的进一步解释进行编辑
enum LineComparisonMode
{
///<summary>the order of the line numbers matters, default</summary>
Ordered = 0,
///<summary>the order of the line numbers doesn't matter
/// Has a higher cost to the default.
///</summary>
Unordered = 1,
}
class ListLineComparer : IEqualityComparer<List<Class>>
{
class LineComparer : IEqualityComparer<Class>
{
public bool Equals(Class x, Class y)
{
return x.IDLinea == y.IDLinea;
}
public int GetHashCode(Class x)
{
return x.IDLinea;
}
}
private readonly LineComparer lines;
private readonly LineComparisonMode mode;
public ListLineComparer() {}
public ListLineComparer(LineComparisonMode mode)
{
this.mode = mode;
}
public bool Equals(List<Class> x, List<Class> y)
{
if (mode == LineComparisonMode.Ordered)
return x.SequenceEqual(y, lines);
else
return x.OrderBy<Class, int>(Line).SequenceEqual(y.OrderBy<Class, int>(Line), lines);
}
private static int Line(Class c)
{
return c.IDLinea;
}
public int GetHashCode(List<Class> x)
{
//this is not a good hash (though correct)
// but not relevant to current question
return x.Sum(c => c.IDLinea);
}
}
// assume List <List<Class>> L = new List<List<Class>>(); from question
var result = L.Distinct(new ListLineComparer());
以IList of Class而不是Lists的形式导致希望这是可以接受的。如果不是,你将自己构建列表,而不是让Linq处理它。 如果你想让{1,2,3}行等于{3,2,1}那么你需要设置模式。
var result = L.Distinct(new ListLineComparer(LineComparisonMode.Unordered));
我自己会做的更加冗长,但是要明确发生了什么/正在做出什么样的假设,因此改变很简单(如果后面的列位置变得很复杂)。
答案 1 :(得分:0)