C#2D整数数组赋值和排序

时间:2013-10-02 15:10:37

标签: c# arrays sorting

我正在尝试使用二维数组的int,但我遇到了一些问题。我想做的是这样的事情:

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};
}

其中functionCall是原型的     int functionCall(){...}

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

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

所以当我迭代valuesSorted时,我会按顺序获取数据。

我会怎么做?

2 个答案:

答案 0 :(得分:4)

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

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();

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

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

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();

当您使用准确表示数据形状的数据结构并在序列上使用序列运算符时,生活变得更容易。

答案 1 :(得分:0)

我认为您试图在第2列中保留原始订单,但也可以使用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()