2014-10-03 145 views
2

您能否告訴我是否有可能具有兩天類型的二維數組。我是C#的新手。在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把這些在一個二維數組,並對其進行排序指數。請讓我知道如果這是可能的例子。

+5

你不希望出現這種情況。您需要一個描述整個對象的類,其中包含描述對象所包含的每條數據的屬性。然後你可能有一個該類的數組或列表。 – 2014-10-03 16:21:20

+0

或者'Dictionary',但是這個對象更適合解決你的問題。 – BradleyDotNET 2014-10-03 16:22:22

+0

@AnthonyPegram是正確的。創建一個類並添加諸如radius和name之類的屬性。然後instanciate並將其填充到列表中。排序將是一個簡單的linq表達式。 – paqogomez 2014-10-03 16:23:18

回答

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>數組,但我看不出有任何理由去的路線,除非你」只是尋找快速和骯髒的東西。

+0

@Brackett謝謝你給我舉一個例子。所以,如果我想打印出這些值的結果,我該怎麼做呢?例如,如果我想訪問第三個元素'Console.WriteLine(l [0,2]);' – 2014-10-04 19:56:14

+1

@ DP的直徑結果。 'l'有一個維度,你不能用兩個索引來索引它。第三個元素的半徑是'l [2] .Radius'(索引是從零開始的)。 – dasblinkenlight 2014-10-04 20:53:11

3

您試圖組織的數據看起來像名稱 - 值對列表,並且具有非唯一名稱。由於每個名稱的項目數量不同,因此二維數組不是建模的理想方法。你會與名稱映射到半徑的名單字典更好如下:

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

+0

您需要將該字典弄平以符合半徑要求的順序。可行,但不是微不足道的。並不是說它不一定適合問題域,但考慮到按半徑排序的唯一要求,似乎並不是一個好的選擇。 – 2014-10-09 00:51:14

1

如果你不想創建某種原因,一類你也可以使用Anonymous Types,所以你的情況下,它會是這樣的:

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

如果這只是臨時處理,你可以也使用Tuple。

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

不要在您的應用程序中傳遞元組。創建一個具有需要存儲和訪問的屬性的類。

0

根據應用程序如何使用這些數據,結構(而不​​是類)也可能是一個可能的解決方案。該結構是通過值傳遞的,並分配在堆棧上,而不是堆。這意味着它不是真正的垃圾收集,但是當堆棧解除放棄或者當它們的包含類型被解除分配時,它會被釋放。因此,如果你有一個非常小的數據結構,那麼不會傳遞太多的結構,這對於你來說可能是一個更有效的內存選擇。我認爲最簡單的方法是基準測試兩種方法,並確定哪種方法最適合您。

有關進一步的參考:

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

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