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

Rya*_*che 124 c#

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

我现在正在做:

new List<string>( new string[] { "title" } ))
Run Code Online (Sandbox Code Playgroud)

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

public static List<T> SingleItemList<T>( T value )
{
    return (new List<T>( new T[] { value } ));
}
Run Code Online (Sandbox Code Playgroud)

所以我能做到:

SingleItemList("title");
Run Code Online (Sandbox Code Playgroud)

有更短/更清洁的方式吗?

谢谢.

M4N*_*M4N 230

只需使用:

List<string> list = new List<string>() { "single value" };
Run Code Online (Sandbox Code Playgroud)

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

List<string> list = new List<string> { "single value" };
Run Code Online (Sandbox Code Playgroud)

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

List<string> list = new List<string> { "value1", "value2", ... };
Run Code Online (Sandbox Code Playgroud)

  • 在第一个选项的括号中放置1个字面值,以便分配恰好一个空格的存储而不是默认值10 (5认同)
  • 默认最终为4,我相信:new List <string> {"Hello"} .Capacity == 4 (5认同)
  • 现在可以缩短为 `new(){"single value"}` (3认同)

Joe*_*orn 36

var list = new List<string>(1) { "hello" };
Run Code Online (Sandbox Code Playgroud)

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

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


Jon*_*eet 26

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

public static List<T> InList<T>(this T item)
{
    return new List<T> { item };
}
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

List<string> foo = "Hello".InList();
Run Code Online (Sandbox Code Playgroud)

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

  • 它有一些内部域特定的语言用法,特别是对于值类型.举个例子:clock.AlertUser.In(1.Minute)读取比clock.AlertUser(TimeSpan.FromMinutes(1))好多了; (4认同)
  • 我还没有在你的书中介绍扩展方法,Jon :-) 这确实看起来有点奇怪,但我喜欢它的实用性。谢谢马丁和乔恩。 (2认同)
  • @Martin:这是*every*类型的奇怪扩展.这通常是气馁的,但这是一个有趣的一般想法. (2认同)

Jon*_*eet 16

基于对Google Java Collections的曝光,对我之前的答案有不同的答案:

public static class Lists
{
    public static List<T> Of<T>(T item)
    {
        return new List<T> { item };
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

List<string> x = Lists.Of("Hello");
Run Code Online (Sandbox Code Playgroud)

我建议查看GJC - 它有很多有趣的内容.(我个人忽略了"alpha"标签 - 它只是开源版本的"alpha",它基于一个非常稳定且使用频繁的内部API .)


Mic*_*ows 7

使用带方法链接的扩展方法.

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

这可以让你这样做:

List<string> strings = new List<string>().WithItems("Yes");
Run Code Online (Sandbox Code Playgroud)

要么

List<string> strings = new List<string>().WithItems("Yes", "No", "Maybe So");
Run Code Online (Sandbox Code Playgroud)

更新

您现在可以使用列表初始值设定项:

var strings = new List<string> { "This", "That", "The Other" };
Run Code Online (Sandbox Code Playgroud)

请参阅http://msdn.microsoft.com/en-us/library/bb384062(v=vs.90).aspx


Wal*_*ski 6

new[] { "item" }.ToList();
Run Code Online (Sandbox Code Playgroud)

它短于

new List<string> { "item" };
Run Code Online (Sandbox Code Playgroud)

而且您不必指定类型.


Squ*_*rel 5

对于 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Grz*_*cki 5

C#/。Net上找到的另一种方法是:

Enumerable.Repeat("value",1).ToList()
Run Code Online (Sandbox Code Playgroud)