在C#中具有两种不同数据类型的二维数组

时间:2014-10-03 16:20:05

标签: c# arrays sorting

请告诉我是否可以使用两天类型的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索引对其进行排序。如果可以通过示例,请告诉我。

5 个答案:

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

我假设在你的情况下,半径的表示需要是十进制的;你也可以使用另一种实数表示,例如floatdouble

答案 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

Why is 16 byte the recommended size for struct in C#?