【问题标题】:Multi array sort in C#C#中的多数组排序
【发布时间】:2015-07-02 07:20:55
【问题描述】:

我有这个数组:

int[] a = {5, 2, 3}; 
int[] b = {4, 1, 2}; 
string[] c = {"John", "Peter", "Max"};

我需要对第二个数组 (b[]) 的值进行排序,但要与其他两个数组相关,以便它们得到相应的排序。例如,1 将首先出现,因为它是最小的数字,并且由于b[] 中的1a[] 中的2c[] 中的"Peter" 相关,那么这意味着2"peter" 也将移动到第一个排序位置。其他两列也是如此;观察:

int[] a = {2, 3, 5}; 
int[] b = {1, 2, 4}; 
string[] c = {"Peter", "Max", "John"};

我该怎么做?

【问题讨论】:

  • 你的问题不太清楚。您是否尝试根据另一个数组的值对一个数组进行排序?
  • 你只是在问如何对数组进行排序?
  • 我的假设是他想通过对该网格的其中一列进行排序来有效地对该网格进行排序。
  • 为什么不使用 DataTable 来实现此目的,其中 abc 是 int、int、string 类型的 DataColumn?

标签: c# arrays


【解决方案1】:

我想我明白你在说什么。您想根据b 的值对数组ac 进行排序。

您可以使用 Array.Sort 按另一个数组对数组进行排序,例如,您可以为键指定另一个数组:

int[] a = { 5, 2, 3 }; 
int[] b = { 4, 1, 2 };
string[] c = { "John", "Peter", "Max" };

Array.Sort(b.ToArray(), c);
Array.Sort(b.ToArray(), a);
Array.Sort(b);
Console.WriteLine(string.Join(", ", a));
Console.WriteLine(string.Join(", ", b));
Console.WriteLine(string.Join(", ", c));

这将输出您的预期值。请注意,我们在按键排序时使用ToArray 创建数组的副本,这是因为Array.Sort 对它们的键和值进行排序,这是我们不想要的。直到最后,我们才对键(在本例中为 b)进行排序。

这就是我们解决您当前问题的方法。但是,从 cmets 收集,您正在尝试对表格数据进行排序。当您的数据具有某种结构时,可以这样说:

public class Item
{
    public int A { get; set; }
    public int B { get; set; }
    public string C { get; set; }
}

它变得很多更容易。

var items = new[]
{
    new Item {A = 5, B = 4, C = "John"},
    new Item {A = 2, B = 1, C = "Peter"},
    new Item {A = 3, B = 2, C = "Max"},
};
var sortedItems = items.OrderBy(i => i.B).ToArray();

这使用LINQ,非常适合您尝试做的事情。

【讨论】:

    【解决方案2】:

    您可能希望查看Tuples,而不是将数据存储在单独的未关联数组中,或者如果可以,使用专用类将数据保持链接在一起

    【讨论】:

      【解决方案3】:

      您能否合并数组,使每个项目代表一条完整的记录?

      // using anonymous types for simplicity
      var source = new[] {
          new { a = 5, b = 4, c = "John" },
          new { a = 2, b = 1, c = "Peter" },
          new { a = 3, b = 2, c = "Max" }
      };
      var results = source.OrderBy(x => x.a);
      

      【讨论】:

        【解决方案4】:
        var indices = Enumerable.Range (0, a.Length).ToArray ();
        var sortedIndices = indices.OrderBy (j => a [j]);
        
        var i = 0;
        foreach (var j in sortedIndices) {
           anew [i] = a [j];
           bnew [i] = b [j];
           cnew [i] = c [j];
           i++;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-14
          • 1970-01-01
          • 2021-09-27
          • 1970-01-01
          • 2014-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多