【问题标题】:Search, Filter AND Remove a List<List<T>>搜索、过滤和删除列表<List<T>>
【发布时间】:2010-10-07 11:46:57
【问题描述】:

我有问题!

我有一个

List <List<Class>> L = new List<List<Class>>();

类包含在哪里

IDLinea
Posizione

等等……

我想要一个 Distinct List&lt;List&lt;Class&gt;&gt; 没有具有相同线条的对象。

例如:

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

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

谢谢。

【问题讨论】:

    标签: c# linq generics list


    【解决方案1】:

    根据您的进一步解释编辑

    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 IList of Class 的形式而不是 Lists 希望这是可以接受的。如果不是,您将自己构建列表,而不是让 Linq 处理它。 如果您想让第 {1,2,3} 行被视为等于 {3,2,1},那么您需要设置模式。

    var result = L.Distinct(new ListLineComparer(LineComparisonMode.Unordered)); 
    

    这有点冗长,我会自己完成,但清楚地表明发生了什么/正在做出什么假设,因此很容易更改(如果说以后会涉及列位置)。

    【讨论】:

    • 您的代码有错误。列表的数量不固定,我需要验证正确的顺序,所以 1-2-3 与 3-2-1 不同,如果列表是 1-2-3
      1-2-3
      3-1
      结果我需要
      1-2-3
      3-1
      希望你能帮助我。谢谢
    • 啊,您最初的问题没有说清楚,您只是想删除重复项,1-2-3 是否与 3-2-1 相同?
    • 不,不一样!感谢所有人和您的耐心!再见。
    • @Giomuti - 现在正确吗?如果是这样,接受会很好。
    • 返回此错误:错误 3 'CotrapClassi.ListLineComparer.LineComparer' 未实现接口成员 'System.Collections.Generic.IComparer.Compare(CotrapClassi.Linea, CotrapClassi.Linea )' ListLineComparer.cs 11 15 CotrapClassi
    【解决方案2】:
    1. 使用列表
    2. 让你的班级超越平等。
    3. 使用列表的 Contains 方法。

    【讨论】:

    • 你能给我写个例子吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 2015-02-08
    • 2017-08-20
    • 2013-06-24
    • 1970-01-01
    • 2010-10-24
    • 2021-03-09
    相关资源
    最近更新 更多