代码之家  ›  专栏  ›  技术社区  ›  Prem

如何从嵌套列表中删除重复行?

  •  -2
  • Prem  · 技术社区  · 6 年前

    嵌套的列表 要作为二维数组执行:

    public List<List<float?>> arrayFloatValue = new List<List<float?>>(); 
    

    此嵌套列表具有 父级和中的列 20000个 子数组中的浮点值。现在我想匹配 重复行 去除

    //Define capacity
    int ColumnsCount = 2000;
    int RowsCount = 20000;
    
    //Create object
    public List<List<float?>> arrayFloatValue = new List<List<float?>>();
    
    //Initiate parent list i.e. 2000 
    arrayFloatValue = new List<float?>[ColumnsCount].ToList();
    
    //Initiate child list i.e. 20000 
    for (int i = 0; i < ColumnsCount; i++)
    {
        arrayFloatValue[i] = new float?[RowsCount].ToList();
    }
    
    //Fill dummy data.
    for (int x = 0; x < ColumnsCount; x++)
    {
        for (int y = 0; y < RowsCount; y++)
        {
            if (y % 50 != 0)
                arrayFloatValue[x][y] = x + y; // Assign dummy value
            else
                arrayFloatValue[x][y] = 0;     // Forcefully 0 value added for each 50th row.
        }
    }
    

    现在我有了

    //  [0] [0]     [1] [0]     [2] [0]     ...
    //      [1]         [2]         [3]     ...
    //      [2]         [3]         [4]     ...
    //      [3]         [4]         [5]     ...
    //      [4]         [5]         [6]     ...
    //      [5]         [6]         [7]     ...
    //      [6]         [7]         [8]     ...
    //      [7]         [8]         [9]     ...
    //      [8]         [9]         [10]    ...
    //      [9]         [10]        [11]    ...
    //  ...         ...         ...
    //      [49]        [50]        [51]    ...
    //      [0]         [0]         [0] ...
    //  
    //  And so on..
    //  
    

    重复值 在里面 . 在上面的例子中 0 在每行索引中重复的值,如 50 呃, 100t 150 那。。。。等等。我想 去除 这些排。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Dmitry Bychenko    6 年前

    你可以试试老的 Distinct 用一个 IEqualityComparer<T> (我们将比较 具有 SequenceEqual ):

    public class ListComparer<T> : IEqualityComparer<IEnumerable<T>> {
      public bool Equals(IEnumerable<T> x, IEnumerable<T> y) {
        return Enumerable.SequenceEqual(x, y);
      }
    
      public int GetHashCode(IEnumerable<T> obj) {
        return obj == null ? -1 : obj.Count();
      }
    }
    

    现在 明显的 :

      List<List<float?>> list = new List<List<float?>>() {
        new List<float?>() { 1, 2, 3},
        new List<float?>() { 4, 5, 6, 7},
        new List<float?>() { 1, 2, 3},
        new List<float?>() { null },
        new List<float?>() { 1, 2, null },
        new List<float?>() { null },
        new List<float?>() { 1, 2 },
      };
    
      var result = list
        .Distinct(new ListComparer<float?>());
    
      string report = string.Join(Environment.NewLine,
        result.Select(line => $"{string.Join(", ", line)}"));
    
      Console.Write(report);
    

    1, 2, 3
    4, 5, 6, 7
    
    1, 2, 
    1, 2
    
        2
  •  1
  •   Victor Coll    6 年前

    如果我理解你的问题,你可以使用哈希集筛选你的列表。但您必须定义一个IEqualityComparer>来检查元素的相等性。

    我举了个例子:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace MyNamespace
    {
        public class Program
        {
            public static void Main()
            {
                List<List<float>> arrayFloatValue = new List<List<float>>
                {
                    new List<float> {1, 2, 3},
                    new List<float> {1, 3, 2},
                    new List<float> {1, 2, 3},
                    new List<float> {3, 5, 7}
                };
    
                var hsArrayFloatValue = new HashSet<List<float>>(arrayFloatValue, new ListComparer());
                List<List<float>> filteredArrayFloatValue = hsArrayFloatValue.ToList();
    
                DisplayNestedList(filteredArrayFloatValue);
    
                //output:
                //1 2 3
                //1 3 2
                //3 5 7
            }
    
            public static void DisplayNestedList(List<List<float>> nestedList)
            {
                foreach (List<float> list in nestedList)
                {
                    foreach (float f in list)
                        Console.Write(f + " ");
    
                    Console.WriteLine();
                }
    
                Console.ReadLine();
            }
        }
    
        public class ListComparer : IEqualityComparer<List<float>>
        {
            public bool Equals(List<float> x, List<float> y)
            {
                if (x == null && y == null)
                    return true;
    
                if (x == null || y == null || x.Count != y.Count)
                    return false;
    
                return !x.Where((t, i) => t != y[i]).Any();
            }
    
            public int GetHashCode(List<float> obj)
            {
                int result = 0;
    
                foreach (float f in obj)
                    result |= f.GetHashCode();
    
                return result;
            }
        }
    }
    

    不过,我不建议你比较浮动。用小数代替。