2015-07-14 3 views
0

Я хотел бы знать, возможно ли создать 2D-массив в C# (а не в строке формата), который содержит столбцы буфера. Первая - Date (строка формата), вторая - Price (формат double).Как создать 2-мерный массив со строковым и двойным форматом

Вот мой код

double [][]=Array[2][]; 

string[]=Date; 

double[]=Prices; 

Array[0]=Date; 

Array[1]=Prices; 
+0

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

ответ

4

Это не возможно поставить string в double массиве. Я предлагаю использовать другой тип, например Tuple<double[], string[]>.

Tuple<double[], string[]> t = new Tuple<double[], string[]>(Prices, Data); 

double[] prices = t.Item1; 
string[] data = t.Item2; 

Но вы могли бы лучше создать свой собственный тип, отражающий эти свойства.

public class YourClass 
{ 
    public double[] Prices {get;set;} 
    public string[] Data {get;set;} 
} 

И использовать его как это:

YourClass c = new YourClass() { Prices = prices, Data = data }; 

Но, может быть, вы хотите, чтобы объединить пункты:

public class PriceInfo 
{ 
    public double Price {get;set;} 
    public string Data {get;set;} 
} 

И просто создать список из них:

List<PriceInfo> list = new List<PriceInfo>(); 
list.Add(new PriceInfo() { Price = 1d, Data = "abc" }); 
+0

Я лично избегал кортежа, как чума для такого рода вещей. Супер нечитаемый. Создание собственного типа (как вы предлагаете) гораздо читабельнее. –

+0

@MatthewWatson: Согласен. Добавлен. –

+0

Действительно; кортежи предоставляют нулевую прозрачность с точки зрения типов данных. И увидеть «что-то. Я7» в коде действительно ужасающе. – mcy

0

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

object[][] array; 

Предлагаю создать объект для хранения ваших значений, а затем создать массив.

public class Container 
{ 
    public string Date { get; set; } 
    public double[] Prices { get; set; } 
} 

Container[] array; 
array[0].Date = "7/14/15"; 
array[0].Prices[0] = 100.00; 
0

Вот альтернатива этому.

Похоже, вы хотите, чтобы иметь возможность искать цены на заданную дату. Если это так, то один из способов решить это заключается в использовании словаря, который отображает даты для массивов двойников:

var pricesByDate = new Dictionary<DateTime, double[]>(); 

Они можно использовать в словарь, чтобы найти цены на определенную дату, как так:

var prices = pricesByDate[myDateToLookU[]; 

простая консоль приложение, которое показывает следующее:

using System; 
using System.Collections.Generic; 

namespace Demo 
{ 
    public class Program 
    { 
     private static void Main() 
     { 
      var pricesByDate = new Dictionary<DateTime, double[]>(); 

      var date1 = new DateTime(2015, 01, 01); 
      var date2 = new DateTime(2015, 01, 02); 
      var date3 = new DateTime(2015, 01, 03); 

      pricesByDate[date1] = new[] { 1.01, 1.02, 1.03 }; 
      pricesByDate[date2] = new[] { 2.01, 2.02, 2.03, 2.04 }; 
      pricesByDate[date3] = new[] { 3.01, 3.02 }; 

      Console.WriteLine("Prices for {0}:", date2); 

      var pricesForDate2 = pricesByDate[date2]; 

      foreach (double price in pricesForDate2) 
       Console.WriteLine(price); 

      Console.WriteLine("\nAll Dates and prices:"); 

      foreach (var entry in pricesByDate) 
      { 
       Console.Write("Prices for {0}: ", entry.Key.ToShortDateString()); 

       foreach (double price in entry.Value) 
        Console.Write(price + " "); 

       Console.WriteLine(); 
      } 
     } 
    } 
} 

я бы, вероятно, использовать List<double>, а не double[] для этого, потому что это позволяет вам к dd и удалить значения после его создания.

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