Создать и использовать общий список? - PullRequest
2 голосов
/ 09 июня 2011

Может кто-нибудь помочь мне понять, как я мог бы упростить этот код, не используя ArrayList?

List<Pair> material = new List<Pair>();
List<string> list = new List<string>();

string tempStr;
int integer = -1;
foreach (string s in ((string)Value).Split(new char[1] { ',' }))
{
  if (int.TryParse(s, out integer))
  {
     tempStr = NameValue.AllKeys[integer];

     if (someCondition == true)
     {
        material.Add(new Pair(tempStr, integer));
     }
     else
     {
        list.Add(tempStr);
     }
  }
}
if(someCondition == true)
{
  return material.ExtensionMethodForLists();
}
else
{
  return list.ExtensionMethodForLists();
}

Когда я пробовал что-то вроде (ниже), я получаю ошибку за то, что не инициализирую переменную с простотой типа.

var list;
if(someCondition == true)
{
  list = new List<Pair>();
}
else
{
  list = new List<string>();
}

Ответы [ 4 ]

6 голосов
/ 09 июня 2011

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

IList list;
if(someCondition == true)
{
  list = new List<Pair>();
}
else
{
  list = new List<string>();
}

или

IList list = someCondition ? (IList)new List<Pair>() : new List<string>();

Лично я не уверенэто отличный дизайн, но он удовлетворяет требованию.

1 голос
/ 09 июня 2011

Не знаю, действительно ли это упрощается, но что-то вроде:

    public DataTable ParseToTable(string Value)
    {
        if (someCondition)
            return ParseInternal<Pair>(Value, (s, i) => new Pair(s, i));
        else
            return ParseInternal<string>(Value, (s, i) => s);
    }

    private DataTable ParseInternal<T>(string Value, Func<string,int,T> newItem)
    {
        List<T> list = new List<T>();

        string tempStr;
        int integer = -1;
        foreach (string s in ((string)Value).Split(new char[1] { ',' }))
        {
            if (int.TryParse(s, out integer))
            {
                tempStr = NameValue.AllKeys[integer];
                list.Add(newItem(tempStr, integer));
            }
        }
        return list.ExtensionMethodForLists();
    }
0 голосов
/ 09 июня 2011

Нечто подобное происходит в Python или другом динамически типизированном языке.Хотя, если вы используете .net 4.0, вы можете использовать динамическое ключевое слово вместо var.

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

0 голосов
/ 09 июня 2011

Если вы собираетесь использовать var, вы должны немедленно присвоить значение.В противном случае, как предполагает @Marc, идеально ... (ну, как он говорит - удовлетворяет требованию)

...