Ярлык для создания одного списка элементов в C # - PullRequest
115 голосов
/ 20 января 2009

В C # есть встроенный ярлык для создания экземпляра списка только с одним элементом.

Я сейчас делаю:

new List<string>( new string[] { "title" } ))

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

public static List<T> SingleItemList<T>( T value )
{
    return (new List<T>( new T[] { value } ));
}

Чтобы я мог сделать:

SingleItemList("title");

Есть ли более короткий / чище способ?

Спасибо.

Ответы [ 13 ]

209 голосов
/ 20 января 2009

Просто используйте это:

List<string> list = new List<string>() { "single value" };

Вы можете даже опустить фигурные скобки ():

List<string> list = new List<string> { "single value" };

Обновление: конечно, это также работает для более чем одной записи:

List<string> list = new List<string> { "value1", "value2", ... };
31 голосов
/ 20 января 2009
var list = new List<string>(1) { "hello" };

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

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

24 голосов
/ 20 января 2009

Идея Майкла об использовании методов расширения приводит к чему-то еще более простому:

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}

Так что вы можете сделать это:

List<string> foo = "Hello".InList();

Я не уверен, нравится мне это или нет, заметьте ...

14 голосов
/ 20 января 2009

Другой ответ на мой предыдущий, основанный на воздействии Google Java Collections :

public static class Lists
{
    public static List<T> Of<T>(T item)
    {
        return new List<T> { item };
    }
}

Тогда:

List<string> x = Lists.Of("Hello");

Я советую проверить GJC - в нем много интересного. (Лично я бы проигнорировал тег "alpha" - это всего лишь версия с открытым исходным кодом, которая называется "alpha", и она основана на очень стабильной и сильно загруженной версии). используется внутренний API.)

7 голосов
/ 20 января 2009

Используйте метод расширения с методом цепочки.

public static List<T> WithItems(this List<T> list, params T[] items)
{
    list.AddRange(items);
    return list;
}

Это позволит вам сделать это:

List<string> strings = new List<string>().WithItems("Yes");

или

List<string> strings = new List<string>().WithItems("Yes", "No", "Maybe So");

Обновление

Теперь вы можете использовать инициализаторы списка:

var strings = new List<string> { "This", "That", "The Other" };

См. http://msdn.microsoft.com/en-us/library/bb384062(v=vs.90).aspx

5 голосов
/ 20 июля 2016

Еще один способ, найденный на C # /. Net Little чудеса :

Enumerable.Repeat("value",1).ToList()
5 голосов
/ 07 июля 2016
new[] { "item" }.ToList();

Это короче

new List<string> { "item" };

и вам не нужно указывать тип.

2 голосов
/ 04 сентября 2014

У меня есть эта маленькая функция:

public static class CoreUtil
{    
    public static IEnumerable<T> ToEnumerable<T>(params T[] items)
    {
        return items;
    }
}

Поскольку он не предписывает конкретный тип возвращаемого значения, он настолько универсален, что я использую его повсеместно. Ваш код будет выглядеть как

CoreUtil.ToEnumerable("title").ToList();

Но, конечно, это также позволяет

CoreUtil.ToEnumerable("title1", "title2", "title3").ToArray();

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

CoreUtil.ToEnumerable("").Concat(context.TrialTypes.Select(t => t.Name))

Сохраняет несколько операторов ToList() и Add.

(Поздний ответ, но я наткнулся на этого старичка и подумал, что это может быть полезно)

2 голосов
/ 18 февраля 2009

Для одного элемента, перечисляемого в Java, это будет Collections.singleton ("string");

В c # это будет более эффективно, чем новый список:

public class SingleEnumerator<T> : IEnumerable<T>
{
    private readonly T m_Value;

    public SingleEnumerator(T value)
    {
        m_Value = value;
    }

    public IEnumerator<T> GetEnumerator()
    {
        yield return m_Value;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        yield return m_Value;
    }
}

но есть ли более простой способ использования фреймворка?

1 голос
/ 18 октября 2016

Попробуйте var

var s = new List<string> { "a", "bk", "ca", "d" };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...