C# 二维整数数组赋值和排序

本文关键字:数组 赋值 排序 整数 二维 | 更新日期: 2023-09-27 18:33:33

我正在尝试使用整数的 2-D 数组,但我遇到了一些问题。我想做的是这样的:

int[,] values = new int[Apples,1]; //Apples = say, 50

我想要结束的是这样的东西:

values={ {393,0},{120,1},{9133,2},{75,3},...}; 但是393120等是在for循环中生成的值。也就是说,我不能像{ {xx},{yy}}等一样通过赋值来初始化数组。所以我想做类似的事情

for (int i = 0; i<Oranges; i++) {
 values[i,0]={functionCall(),i};
}

其中函数调用是原型的,例如 int functionCall(({...}

但是这个分配values[i,0]不起作用。完成此分配过程后,我需要按第一列对数组进行排序,因此我会得到一个新的数组valuesSorted,如下所示:

valuesSorted={ {75,3},{120,1},{393,0},{9133,2},...} 

因此,当我迭代valuesSorted时,我将按该顺序获取数据。

任何想法我会怎么做?

C# 二维整数数组赋值和排序

首先,让我们解决您的具体问题。 数组大小应为两个,而不是一个;一个维度大小为一维的多维数组没有多大意义。

int[,] values = new int[50,2]; 

接下来,如何在循环中初始化此数组?

for (int i = 0; i<Oranges; i++)
  values[i,0]={functionCall(),i};

这是非法的,因为{ }语法只能在数组初始值设定项中使用。相反,你的意思是说:

for (int i = 0; i < 50; i++)
{
  values[i,0]= functionCall();
  values[i,1]= i;
}

接下来,如何对数组进行排序?

你没有。多维数组很难排序,并且很少有工具可以这样做。您必须编写自己的排序算法才能就地执行此操作。

由于这是目标,我们现在感到沮丧,我们应该退后一步,重新考虑二维数组是否是正确的数据结构。其实不然。 这是解决问题的正确方法:

struct Pair<T>
{
  public T First { get; private set; }
  public T Second { get; private set; }
  public Pair(T first, T second) : this()
  {
    First = first;
    Second = second;
  }
}
...
static IEnumerable<Pair<int>> Pairs()
{
  int i = 0;
  while(true)
  {
    yield return new Pair<int>(functionCall(), i);
    i = i + 1;
  }
}
...
List<Pair<int>> pairs = 
  Pairs()
    .Take(50)
    .OrderBy(p=>p.First)
    .ToList();

现在我们有一个包含五十对整数的排序列表,这就是您想要的。此外,从代码中可以非常清楚地看出,我们有一个包含 50 对整数的排序列表。

这是一个替代解决方案,它使用我更喜欢的"使用索引选择"功能:

static IEnumerable<int> Values()
{
  while(true)
    yield return functionCall();
}
...
List<Pair<int>> pairs = 
  Values()
    .Take(50)
    .Select((item, index)=>new Pair<int>(item, index))
    .OrderBy(p=>p.First)
    .ToList();

当您使用准确表示数据形状的数据结构并对序列使用序列运算符时,生活会变得更加轻松。

我认为您正在尝试在第二列中保留原始顺序,但也可以通过Dictionary<int, int>SortedList<int,int>来完成

试试这个:

class Program
{
    static Random rnd=new Random();
    static int functionCall()
    {
        return rnd.Next(1, 1000);
    }
    static void Main(string[] args)
    {
        var original=new Dictionary<int,int>(10);
        for(int i=0; i<10; i++)
        {
            original.Add(functionCall(), i);
        }
        // original:
        //
        // [646, 0]
        // [130, 1]
        // [622, 2]
        // [454, 3]
        // ...
        // [658, 9]
        var sorted=new SortedList<int, int>(original);
        // sorted:
        //
        // [ 90, 5]
        // [130, 1]
        // [404, 7]
        // [454, 3]
        // ...
        // [756, 8]
    }
}

请注意,已添加Random()以模拟您的functionCall()