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},...};
但是393
、120
等是在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
时,我将按该顺序获取数据。
任何想法我会怎么做?
首先,让我们解决您的具体问题。 数组大小应为两个,而不是一个;一个维度大小为一维的多维数组没有多大意义。
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()
。