搜索,过滤和删除列表<list <t>&gt; </list <t>

时间:2009-02-13 16:25:10

标签: c# linq generics list

我有问题!

我有一个

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

我希望我需要的是清楚的。

感谢。

2 个答案:

答案 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)

  1. 使用列表
  2. 让您的班级覆盖等于。
  3. 使用列表的Contains方法。