【问题标题】:Two-Dimensional Array with two different data types in C#C#中具有两种不同数据类型的二维数组
【发布时间】:2014-11-28 17:46:50
【问题描述】:

你能告诉我是否可以有一个包含两天类型的二维数组。我是 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

我想将它们放入一个二维数组并根据第一个double 索引对其进行排序。请让我知道这是否可行。

【问题讨论】:

  • 你不想这样。您需要一个描述整个对象的类,以及描述对象包含的每条数据的属性。然后你可能有一个该类的数组或列表。
  • Dictionary,但该对象更适合解决您的问题。
  • @AnthonyPegram 说得对。创建一个类并添加半径和名称等属性。然后实例化并将它们填充到列表中。排序将是一个简单的 linq 表达式。
  • 感谢您的所有回答和 cmets。他们都非常乐于助人。

标签: c# arrays sorting


【解决方案1】:

您尝试组织的数据看起来像一个名称-值对列表,具有非唯一名称。由于每个名称的项目数不同,因此二维数组不是对其建模的理想方式。您最好使用将名称映射到半径列表的字典,如下所示:

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

【讨论】:

  • 您需要展平该字典以满足按半径排序的要求。可行,但并非微不足道。并不是说它不一定适合问题域,但考虑到按半径排序的唯一要求,这似乎不是一个好选择。
【解决方案2】:

正如 cmets 所说,您可能需要一个简单的类:

 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&lt;int, string&gt; 的数组侥幸逃脱,但我认为没有太多理由走这条路,除非您只是在寻找快速而肮脏的东西。

【讨论】:

  • @Brackett 感谢您向我展示示例。那么,如果我想打印出这些值的结果,我该怎么做呢?例如,如果我想访问第三个元素的直径结果Console.WriteLine(l[0,2]);
  • @DP。 l 有一个维度,你不能用两个索引来索引它。第三个元素的半径为l[2].Radius(索引从零开始)。
【解决方案3】:

如果你因为某种原因不想创建一个类,你也可以使用Anonymous Types,所以对于你的情况,它会是这样的:

        var a1 = new[] {
            new {Radius = 4.7, Name = "Iris-setosa"},
            new {Radius = 4.6, Name = "Iris-setosa"}
        };

【讨论】:

    【解决方案4】:

    如果这只是临时处理,你也可以使用元组。

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

    不要在你的应用程序中传递元组。创建一个具有您需要存储和访问的属性的类。

    【讨论】:

      【解决方案5】:

      根据您的应用程序将如何使用这些数据,结构(而不​​是类)也可能是一种可能的解决方案。结构按值传递并分配在堆栈上,而不是堆上。这意味着它并不是真正的垃圾回收,而是在堆栈展开或它们的包含类型被释放时被释放。

      因此,如果您有一个非常小的数据结构,并且不会被大量传递,那么结构可能是您更节省内存的选择。我认为最简单的判断方法是对这两种选择进行基准测试,看看哪一种最适合您。

      请参阅以获取更多参考:

      https://msdn.microsoft.com/en-us/library/ms229017(v=vs.110).aspx

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-10
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        相关资源
        最近更新 更多