2012-01-30 2 views
2

Я хочу создать статический ReadOnlyCollection со строками.Элегантное выделение статического набора строк только для чтения

Есть ли способ сделать это выражение короче или более элегантным?

public static readonly ReadOnlyCollection<string> ErrorList = new ReadOnlyCollection<string>(
    new string[] { 
    "string1", 
    "string2", 
    "string3", 
    } 
); 

Я использую это много раз, но в разных файлах.

+2

вы можете опустить '' string' в новой строке [] {... ', но не что-нибудь еще ... – SWeko

ответ

8
public static readonly ReadOnlyCollection<string> ErrorList = new ReadOnlyCollection<string>(
    new [] { 
    "string1", 
    "string2", 
    "string3" 
    } 
); 
8

Другой вариант заключается в использовании List<T> с коллекцией инициализаторе и AsReadOnly метод:

public static readonly ReadOnlyCollection<string> ErrorList = new List<String> { 
    "string1", 
    "string2", 
    "string3", 
    }.AsReadOnly(); 
+1

Но, это более элегантно ... –

+1

@FrederikGheysels: Лично я был бы доволен любым подходом. Я думаю, что я предпочитаю это явно создавать массив, а затем обертывать его, но оба будут одинаково хорошо работать. –

2

Самый компактный я думаю:

using StringCol = ReadOnlyCollection<string>; 
... 
public static readonly StringCol ErrorList = new StringCol(
     new[] 
     { 
     "string1", 
     "string2", 
     "string3", 
     }); 

директива using только здесь чтобы уменьшить количество кода, если вы используете ReadOnlyCollection<string>. Если это не так, это ничего не уменьшит.

+2

Picky: Это директива using, а не оператор using. Но я не думаю, что это самая компактная форма, доступная :) –

+1

@JonSkeet Спасибо, что указали ошибку «использования», отредактировано;) И на самом деле вы правы, это не самый короткий из них. – ken2k

0

Я подумал о другой возможности, объединив некоторые замечательные ответы в этом посте.

Создать пользовательский метод с params:

public static ReadOnlyCollection<String> CreateStringsReadOnlyCollection(params string[] st){ 

     return new ReadOnlyCollection<String>(st); 
    } 

А потом использовать его люблю:

public readonly static ReadOnlyCollection<String> col = CreateStringsReadOnlyCollection("string1", "string2", "string3"); 
1

Array.AsReadOnly<T> и new[] может вывести содержимое массива:

public static readonly ReadOnlyCollection<string> ErrorList = Array.AsReadOnly(
    new[] { 
    "string1", 
    "string2", 
    "string3", 
    } 
); 

Если вы не против работать с интерфейсом, ReadOnlyCollection<T> implements several of them включая IList<T>:

public static readonly IList<string> ErrorList = Array.AsReadOnly(
    new[] { 
    "string1", 
    "string2", 
    "string3", 
    } 
); 

Стилистически, я предпочитаю, чтобы избежать нескольких углублений для одного блока:

public static readonly IList<string> ErrorList = Array.AsReadOnly(new[] { 
    "string1", 
    "string2", 
    "string3", 
}); 
Смежные вопросы