2011-06-08 3 views
2

Может ли кто-нибудь помочь мне выяснить, как я могу упростить этот код, не используя 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(); 
} 

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

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

список не может быть двух разных типов. – alternative

+0

@mathepic - Я не был уверен, могу ли я использовать дженерики здесь, чтобы помочь – Brett

+0

Вам нужны оба типа для наследования из общего интерфейса/типа. Оберните пару и строку в типы с общим интерфейсом/базовым типом. – Maxim

ответ

6

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

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

или

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

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

+2

Только проблема с неэквивалентным IList заключается в том, что работа с ним как таковым не слишком далеко от использования ArrayList. – KeithS

+0

Полностью передумал, используя IList, но есть ли у вас рекомендации относительно лучшего дизайна? – Brett

+2

@ KeithS - не совсем; вы не можете поставить 'Pair' в« Список »случайно, хотя он отображается как' IList' –

0

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

0

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

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

1

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

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(); 
    } 
Смежные вопросы