【问题标题】:Sort 2D array in C#在 C# 中对二维数组进行排序
【发布时间】:2018-05-14 04:04:33
【问题描述】:

我试图使用 IComparer 比较 C# 中的二维数组,但无法从我的角度编译代码,排序方法 ab 被假定为 jagad 数组而不是普通数组。有人知道如何解决这个问题

int[,] ab = new int[3, 4] 
{ 
    { 1, 2, 3, 4 }, 
    { 5, 6, 7, 8 }, 
    { 2, 3, 4, 5 } 
}; 
Array.Sort<int[]>(ab, new ComparerTwoDArray()); 
foreach (var i in ab) 
{ 
    Console.WriteLine(i); 
} 

class ComparerTwoDArray : IComparer<int[]> 
{ 
    int ix; 

    public int Compare(int[] x, int[] y) 
    { 
        return x[0].CompareTo(y[0]); 
    } 
}

【问题讨论】:

  • 您似乎只是在比较子阵列的第一个元素。这是故意的吗?如果不是,那么您如何确定一个数组是 smaller 还是 greater 比另一个?这个例子怎么样:{1,2,1}{1,1,2}哪个更小?
  • Array.Sort 只支持一维数组,所以无论如何都行不通。
  • 锯齿状数组是int[3][4],但您的代码是关于多维数组int[3,4]。我想你的代码是你的真相,而文字只是拼错了。

标签: c# sorting multidimensional-array visual-studio-2013


【解决方案1】:

您没有使用正确的方法:https://msdn.microsoft.com/en-us/library/system.array.sort%28v=vs.110%29.aspx

Array.Sort 方法:对一维数组中的元素进行排序。

您可以使用List&lt;List&lt;int&gt;&gt;,然后使用它的Sort LINQ 扩展,例如:

list.Sort((x,y) => x[0].CompareTo(y[0]));

【讨论】:

    【解决方案2】:

    不幸的是,多维数组是一头静态的野兽。您可以通过提供 n 维坐标轻松访问其中的单个元素(例如,3d 数组中的array[2,8,4]),但您无法访问任何整个区域(如行、列、矩形等)。

    如果您确实需要进行这种重新排序,则不应将数据保存在多维数组中。而是将其放入锯齿状数组或列表列表中,甚至是 IReadOnlyDictionary&lt;int, IReadOnlyDictionary&lt;int, IReadOnlyDictionary&lt;int, int&gt;&gt;&gt; 用于 4 维稀疏矩阵。在这种情况下,您可以很容易地为每个维度编写一个比较器。

    在您的情况下,您只需要像 List&lt;IReadOnlyList&lt;int&gt;&gt;IComparer&lt;IReadOnlyList&lt;T&gt;&gt; 这样的东西,可能会像这样实现:

    public class ListComparer<T> : IComparer<IReadOnlyList<T>>
    {
        public static readonly IComparer<IReadOnlyList<T>> Default = new ListComparer<T>();
    
        private readonly bool _checkCount;
        private readonly int _numberOfElementsToCompare;
        private readonly IComparer<T> _elementComparer;
    
        public ListComparer()
            : this(true, 1, Comparer<T>.Default)
        {
        }
    
        public ListComparer(
            bool checkCount,
            int numberOfElementsToCompare,
            IComparer<T> elementComparer)
        {
            _checkCount = checkCount;
            _numberOfElementsToCompare = numberOfElementsToCompare;
            _elementComparer = elementComparer
                ?? throw new ArgumentNullException(nameof(elementComparer));
        }
    
        public int Compare(IReadOnlyList<T> x, IReadOnlyList<T> y)
        {
            if (ReferenceEquals(x, y))
                return 0;
    
            if (ReferenceEquals(x, null))
                return -1;
    
            if (ReferenceEquals(y, null))
                return 1;
    
            if (_checkCount)
            {
                var diff = x.Count.CompareTo(y.Count);
    
                if (diff != 0)
                    return diff;
            }
    
            return x.Take(_numberOfElementsToCompare)
                .Zip(y, (i, j) => _elementComparer.Compare(i, j))
                .SkipWhile(value => value == 0)
                .FirstOrDefault();
        }
    }
    

    并且会被使用:

        var matrix = new List<IReadOnlyList<int>>
        {
            { new List<int> { 1, 2, 3, 4 }  },
            { new List<int> { 5, 6, 7, 8 }  },
            { new List<int> { 2, 3, 4, 5 }  }
        };
    
        matrix.Sort(ListComparer<int>.Default);
    
        foreach (var item in matrix)
        {
            Console.WriteLine(String.Join(", ", item));
        }
    

    【讨论】:

      猜你喜欢
      • 2019-05-17
      • 2015-01-30
      • 2012-12-15
      • 1970-01-01
      • 2014-08-10
      • 2017-12-04
      • 2021-11-07
      • 2022-01-24
      相关资源
      最近更新 更多