2012-03-29 1 views
2

Скажем, у меня есть 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); 

Возможно ли это? Я мечтаю о кодовой роскоши?

ответ

2

Вы можете сделать это следующим образом:

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

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

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

Details = new List<string>(someArray.Select(s => string.Format("'{0}'", s))) 
+0

Ударьте меня на 2 секунды, p (глупый captcha подошел ...) – leppie

+0

Я думаю, вам нужно удалить ';', поскольку это даст вам эксклюзию. –

+0

@NeilKnight Вы правы! Спасибо, я удалил обе точки с запятой! – dasblinkenlight

0

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

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

Если предположить, что вы не хотите, чтобы инициализировать список из массива, но на самом деле хочет, чтобы иметь возможность записывать элементы списка непосредственно в инициализаторе вы можете использовать collection initializer:

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

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

0

Вы могли бы вызвать метод расширения ToList() на сборнике «SomeArray», который будет создавать копию, чтобы вы могли присвоить вашу собственность STRUCT, как так:

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

Что-то вдоль линии:

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

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

Кроме того, стоит рассмотреть, почему вы используете структуру с свойством, являющимся списком; может быть лучше иметь класс вместо структуры.