2009-09-07 5 views
4

Id 'хотел создать список данных, которые будут переданы от метода к методу, однако я не могу использовать структуру, потому что данные, которые будут содержаться в этом списке, будут различаться в зависимости от ввода.Список различных типов?

Например

if (x == 1) { 
    a = 1 
    b = true 
    c = 42 
    d = "hello" 
} 

if (x == 2) { 
    a = 2 
    b = 'g' 
    c = "sup" 
} 

Я считаю, что мои варианты следующим образом:

  1. Создать массив или список строк, и отбрасывать данные обратно к тому, что он изначально был из строк. Это беспорядочно и может привести к ошибкам неинтерпретируемого ввода, хотя это будет не так уж плохо, поскольку все это будет обнаружено во время выполнения.
  2. Создайте структуру для каждой возможности - Это даже хорошая практика?
  3. Как-то использовать дженерики. Из того, что я знаю, в то время как дженерики безопасны по типу, но не строгие, они должны быть применены к типам до их использования. Например, если бы мне нужен список элементов здесь, мне нужно было бы отличить их от строк, как это было бы с решением 1, что сделало бы это бесполезным.

Мой вопрос тогда, какой из этих вариантов является лучшим? Или есть альтернативный вариант, использующий какой-то общий тип, о котором я не знаю? Количество возможных переменных в каждом случае может меняться, как и их типы. Я хотел бы иметь возможность возвращать один список или массив вызывающему методу, чтобы он мог соответствующим образом обрабатывать результат. Он будет знать, как обращаться с каждой группой данных на основе значения a, так как это будет идентификатор выбора действия. Я также знаю, что бросать их на объекты и обратно каждый раз очень интенсивно, поэтому я бы предпочел избежать этого.

Это, вероятно, довольно простой, но он меня в тупик ...

+0

Чтобы дать немного больше информации, в основном это попытка, в зависимости от выбора пользователя, интерпретировать различные данные из входной строки. Если они говорят одно, мне нужно проверить эти данные, а затем захватить их, составив список этих данных и их типов (из этой информации вытекают различные вещи). Проблема в том, что я хотел бы сделать ее расширяемой, поэтому я всегда могу добавить что-то, не придерживаясь строгой структуры, и мне не придется переделывать все при использовании. Мне нравится предложение ArrayList, а также рефакторинг. Я попробую его пересмотреть. – George

ответ

4

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

Если вы хотите вернуться к значениям с помощью ключа, рассмотрите возможность использования Hashtable.

3

Общий принцип в .NET заключается в том, что каждый тип может быть перенесен в System.Object (хотя он может включать бокс). Вы можете использовать такой метод, как

void Foo(params object[] parameters) { ... } 

Или используйте класс System.Collections.ArrayList.

«проблема» в том, что, когда вы хотите использовать такое значение, вам нужно код, как:

if (parameters[i] is string) 
    { 
     string s = (string) parameters[i]; 
     ... 
    } 
2

К сожалению, это не код, связанный с ответом: там может быть неправильная конструкция скрытый за такой конструкцией. Убедитесь, что вы знаете, что делаете, иначе вещи могут отступить.

Если не зная тип полей, которые вы используете заранее действительно требуется, это требует подхода, который сохраняет данные с их типом, как

struct foo { 
    private object _value; 
    private string _type; 
    foo(string myType, object myValue) { 
     _value = myValue; 
     _type = myType; 
    } 
} 

, а затем с помощью Generics для обработки бизнес-логики.

1

Вы можете представить элементы данных с помощью Dictionary/Hashtable, а затем добавить эти словари в List.

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

2

В принципе, вам нужен список, набранный объекту, а затем да, вы находитесь в режиме отбрасывания.

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

Если вам действительно нужно хранить разные типы в списке, попробуйте создать структуру, содержащую элемент каждого типа, а также флаг, указывающий, какой тип данных представлен. Затем используйте общую коллекцию для этой структуры. Нечто подобное (с верхней части моей головы)

struct FooType 
{ 
    public string StringValue; 
    public bool BoolValue; 
    public int IntValue; 
    public char CharValue; 

    public string DataType; 

    // You'd probably want constructors too 
} 

Тогда общий список:

var values = new List<FooType>(); 

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

Мне все еще не нравится ответ; это похоже на то, что ваш дизайн может слишком много работать, и могут быть возможности рефакторинга, но поскольку я не вижу больше вашего кода или намерения, все, что я могу сделать, это ответить на то, что вы просили. :)

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