在C#中创建单项列表的快捷方式

时间:2009-01-20 19:44:40

标签: c#

在C#中,是否有内联快捷方式来实例化List< T>只有一个项目。

我现在正在做:

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

在任何地方都使用此代码会降低可读性。我曾想过使用像这样的实用方法:

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

所以我能做到:

SingleItemList("title");

是否有更短/更清洁的方式?

感谢。

14 个答案:

答案 0 :(得分:208)

只需使用:

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

你甚至可以省略()大括号:

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

更新:当然这也适用于多个条目:

List<string> list = new List<string> { "value1", "value2", ... };

答案 1 :(得分:31)

var list = new List<string>(1) { "hello" };

与其他人发布的内容非常相似,只是它确保最初只为单个项目分配空间。

当然,如果你知道你以后会添加一堆东西,那可能不是一个好主意,但仍然值得一提。

答案 2 :(得分:24)

迈克尔使用扩展方法的想法导致更简单的事情:

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

所以你可以这样做:

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

我不确定我是否喜欢它,请注意......

答案 3 :(得分:14)

根据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。)

答案 4 :(得分:7)

使用方法链的扩展方法。

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 :(得分:5)

new[] { "item" }.ToList();

new List<string> { "item" };

并且您不必指定类型。

答案 6 :(得分:5)

另一种方式,发现于C#/.Net Little wonders

Enumerable.Repeat("value",1).ToList()

答案 7 :(得分:2)

对于java中可枚举的单个项目,它将是Collections.singleton(“string”);

在c#中,这比新的List更有效:

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;
    }
}

但使用框架有更简单的方法吗?

答案 8 :(得分:2)

我有这个小功能:

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语句。

(迟到的答案,但我偶然发现了这个老人并认为这可能会有所帮助)

答案 9 :(得分:1)

您也可以

new List<string>() { "string here" };

答案 10 :(得分:1)

我会做的

var list = new List<string> { "hello" };

答案 11 :(得分:1)

受到其他答案的启发(所以我可以随时随地拿起它!),但命名/样式与F#(每个数据结构具有标准singleton函数*)对齐:

namespace System.Collections.Generic
{
    public static class List
    {
        public static List<T> Singleton<T>(T value) => new List<T>(1) { value };
    }
}

*当然除了ResizeArray本身,因此这个问题:)

在实践中,我实际将其命名为Create,以便与我定义的其他帮助程序对齐,例如Tuple.CreateLazy.Create [2],LazyTask.Create等:

namespace System.Collections.Generic
{
    static class List
    {
        public static List<T> Create<T>(T value) => new List<T>(1) { value };
    }
}

[2]

namespace System
{
    public static class Lazy
    {
        public static Lazy<T> Create<T>(Func<T> factory) => new Lazy<T>(factory);
    }
}

答案 12 :(得分:1)

尝试 var

lists:map

答案 13 :(得分:0)

您需要从 List<> 类创建一个继承者

    public class SingletonList<T> : List<T>
    {
        public SingletonList(T element) : base(1)
        {
            this.Add(element);
        }
    }

并且您可以使用它代替基本的 List<>

var singletonList = new SingletonList<string>("Hello World!");