2014-10-03 3 views
2

Не могли бы вы рассказать мне, возможно ли иметь 2D-массив с двухдневными типами. Я новичок в 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 

Я хотел бы поставить их в к 2D массив и отсортировать его по первому double индекс. Пожалуйста, дайте мне знать, если это возможно с примером.

+5

Вы не хотите этого.Вам нужен класс, который описывает общий объект, со свойствами, описывающими каждую часть данных, содержащихся в этом объекте. Тогда у вас может быть массив или список этого класса. –

+0

Или «Словарь», но объект лучше для решения вашей проблемы. – BradleyDotNET

+0

@ У Энтони Пеграмма это правильно. Создайте класс и добавьте свойства, такие как радиус и имя. Затем создайте и запишите их в список. Заказ будет простым выражением linq. – paqogomez

ответ

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]),' –

+1

@DP. 'l' имеет одно измерение, вы не можете индексировать его двумя индексами. Радиус третьего элемента будет «l [2] .Radius' (индексы основаны на нуле). – dasblinkenlight

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.

+0

Вам нужно будет сгладить этот словарь, чтобы выполнить заказ по радиусу. Возможность, но не тривиальная. Не сказать, что это не обязательно соответствует проблемной области, но не кажется отличным выбором, учитывая одно требование сортировать по радиусу. –

1

Если вы не хотите, чтобы создать класс для какой-то причине вы можете также использовать Anonymous Types, поэтому для вашего случая это будет что-то вроде:

 var a1 = new[] { 
      new {Radius = 4.7, Name = "Iris-setosa"}, 
      new {Radius = 4.6, Name = "Iris-setosa"} 
     }; 
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); 

Не пропускайте кортежи вокруг в вашем приложении. Создайте класс, на котором есть свойства, необходимые для хранения и доступа.

0

В зависимости от того, как ваше приложение будет использовать эти данные, структура (а не класс) также может быть возможным решением. Структура передается по значению и выделяется в стеке вместо кучи. Это означает, что на самом деле это не сбор мусора, а освобождение, когда пакет распадается или когда их содержащий тип освобождается.

Таким образом, если у вас очень маленькая структура данных, которая не передается в значительной степени, структура может быть для вас более экономичным выбором. Я думаю, что самый простой способ рассказать - сравнить две альтернативы и посмотреть, какой из них лучше всего подходит для вас.

см для справок:

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

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

Смежные вопросы