Создание списка внутри инициализатора типа - PullRequest
2 голосов
/ 29 марта 2012

Скажем, у меня есть struct, например,

public struct MyStruct
{
     string StructConfig { get; set; }
     List<string> Details { get; set; }

     public MyStruct
     {
         Details = new List<string>();
     }
}

И я создаю это struct, используя:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details"
}

Мне интересно, как я могу добавить foreach цикл, который будет добавлять детали в свойство Details вместо выполнения:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details"
}
s.Details = new List<string>();
foreach (var detail in someArray)
    s.Details.Add(detail);

Возможно ли это вообще?Мечтаю о коде-роскоши?

Ответы [ 6 ]

2 голосов
/ 29 марта 2012

Вы можете сделать это так:

MyStruct s = new MyStruct() 
{
    StructConfig = "Some config details",
    Details = new List<string>(someArray)
}

Это работает, потому что List<T> поддерживает инициализацию от IEnumerable<T> до этого конструктора .

Если вам необходимо выполнить дополнительные приготовления для элементов someArray, вы можете использовать LINQ и добавить Select. Пример ниже добавляет одинарные кавычки вокруг каждого элемента:

Details = new List<string>(someArray.Select(s => string.Format("'{0}'", s)))
1 голос
/ 29 марта 2012

Предполагая, что вы не хотите инициализировать список из массива, но действительно хотите иметь возможность записи элементов списка непосредственно в инициализаторе, вы можете использовать инициализатор коллекции :

var myStruct = new MyStruct() {
  StructConfig = "Some config details",
  Details = new List<string>() { "a", "b", "c" }
};

Теперь структура, содержащая строку и список строк, выглядит немного странно, но это не влияет на то, как ответить на вопрос.

1 голос
/ 29 марта 2012

Как насчет?

s.Details = new List<string>(someArray);
0 голосов
/ 29 марта 2012

Что-то вроде:

s.Details = someArray.Select(detail=> detail.ToString()).ToList()

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

Также стоит подумать, почему вы используете структуру со свойством List;может быть лучше иметь класс вместо структуры.

0 голосов
/ 29 марта 2012

Вы можете вызвать метод расширения ToList () в коллекции someArray, который создаст его копию, которую вы можете назначить свойству struct, например:

0 голосов
/ 29 марта 2012

может сделать что-то вроде этого

MyStruct s = new MyStruct
{
    StructConfig = "Some config details",
    Details = someArray.ToList()
};
...