请告诉我是否可以使用两天类型的2D数组。我是C#的新手。
例如:array[double][string]
我的花朵半径与他们的名字如下:
4.7,Iris-setosa
4.6,Iris-setosa
7,Iris-versicolor
6.4,Iris-versicolor
6.9,Iris-versicolor
5.5,Iris-versicolor
6.5,Iris-versicolor
6.3,Iris-virginica
5.8,Iris-virginica
我想将它们放入2D数组中,并根据第一个double
索引对其进行排序。如果可以通过示例,请告诉我。
答案 0 :(得分:3)
您尝试组织的数据类似于名称 - 值对列表,具有非唯一名称。由于每个名称的项目数不同,因此2D阵列不是建模它的理想方式。你最好使用一个将名称映射到半径列表的字典,如下所示:
Dictionary<string,List<decimal>>
以下是您在这样的词典中组织数据的方式:
var data = new Dictionary<string,List<decimal>> {
{"Iris-setosa", new List<decimal> {4.7M, 4.6M}}
, {"Iris-versicolor", new List<decimal> {7M, 6.4M, 6.9M, 5.5M, 6.5M}}
, {"Iris-virginica", new List<decimal> {6.3M, 5.8M}}
};
我假设在你的情况下,半径的表示需要是十进制的;你也可以使用另一种实数表示,例如float
或double
。
答案 1 :(得分:2)
正如评论所说,你可能想要一个简单的课程:
public class Flower {
public double Radius { get; set; }
public string Name { get; set; }
}
var l = new List<Flower>();
l.Add(new Flower() { Radius = 4.7, Name = "Iris-setosa" });
l.Add(new Flower() { Radius = 4.6, Name = "Iris-setosa" });
/* ... */
Flower[] sorted = l.OrderBy(f => f.Radius).ToArray();
你可以通过一系列KeyValuePair<int, string>
来逃避,但除非你只是寻找快速和肮脏的东西,否则我没有太多理由走这条路。
答案 2 :(得分:2)
如果您因某些原因不想创建课程,也可以使用Anonymous Types,因此对于您的情况,它将类似于:
var a1 = new[] {
new {Radius = 4.7, Name = "Iris-setosa"},
new {Radius = 4.6, Name = "Iris-setosa"}
};
答案 3 :(得分:0)
如果这仅用于临时处理,您也可以使用元组。
List<Tuple<decimal, string>> test = new List<Tuple<decimal, string>>();
test.Add(Tuple.Create<decimal, string>(4.7M, "Iris-setosa"));
test.Add(Tuple.Create<decimal, string>(4.6M, "Iris-setosa"));
var sortedList = test.OrderBy(i => i.Item1);
但是,不要在你的应用程序中传递Tuples。创建一个具有您需要存储和访问的属性的类。
答案 4 :(得分:0)
根据应用程序将如何使用此数据,结构(而不是类)也可能是一种可能的解决方案。结构按值传递,并在堆栈上分配,而不是堆。这意味着它不是真正的垃圾收集,而是在堆栈展开时或者当它们的包含类型被释放时解除分配。
因此,如果你有一个非常小的数据结构,那么一个结构可能是一个更有效的内存选择。我认为最简单的方法是对这两种方案进行基准测试,看看哪种方案最适合你。
有关详细信息,请参阅:
https://msdn.microsoft.com/en-us/library/ms229017(v=vs.110).aspx