2010-09-07 2 views
2

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

+0

Насколько важна производительность? Если это так, я мог бы попробовать написать собственный класс, сохраняя их отдельно, но подвергая их как один. – Aliostad

+0

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

ответ

4

Вы можете использовать object[] и сделать некоторые проверки типов. Вы получите бокс/распаковку при доступе к парным разрядам, но в любом случае это будет быстрее, чем double.Parse().

Альтернативой является создание класса с обоими типами и маркером:

class StringOrDouble 
{ 
    private double d; 
    private string s; 
    private bool isString; 

    StringOrDouble(double d) 
    { 
     this.d = d; 
     isString = false; 
    } 

    StringOrDouble(string s) 
    { 
     this.s = s; 
     isString = true; 
    } 

    double D 
    { 
     get 
     { 
      if (isString) 
       throw new InvalidOperationException("this is a string"); 
      return d; 
     } 
    } 

    string S 
    { 
     get 
     { 
      if (!isString) 
       throw new InvalidOperationException("this is a double"); 
      return s; 
     } 
    } 
    bool IsString { get { return isString; } } 
} 

, а затем создать массив StringOrDouble. Это избавит вас от некоторых типов проверки и бокса, но будет иметь большие накладные расходы памяти.

+0

^это то, что вы здесь описываете? – sooprise

3

уверен использование:

object[], ArrayList, or List<Object>; 

Вам придется бросить, и, возможно, заплатить штраф за бокс удваивается, но они позволяют хранить два различных типа.

+0

Что вы рекомендовали бы для максимальной эффективности? Я имею дело с размером элементов размером 50 КБ. – sooprise

+0

@Soo - Всегда ли это 50k элементов и каждый из 50k элементов всегда заполнен? –

+0

всегда 50 КБ, всегда заполнено – sooprise

0

object[] и ArrayList - два достойных варианта; это зависит от того, нужен ли вам традиционный массив фиксированной длины или вектор (массив переменной длины). Кроме того, я бы «обернул» один из них в пользовательский класс, который выполнял некоторую проверку типов, если строки и парные разряды являются ТОЛЬКО вещами, с которыми вы можете иметь дело, и вам нужно получить их обратно в виде строк и удвоений.

0

Не самое эффективное использование, но как насчет гибкости:

var a = new object[] {1,2,3,"paul",5.5} 

или даже

var a = new object[] {1,2,3,"paul",5.5, new List<string>() {"apple","banana","pear"} } 
Смежные вопросы