在C#中创build单个项目列表的快捷方式

在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"); 

有没有更简洁的方法?

谢谢。

简单地使用这个:

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

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

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

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

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

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

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

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

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

所以你可以这样做:

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

我不确定我是否喜欢它,介意你…

根据对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"); 

我build议检查GJC – 它有很多有趣的东西英寸(个人而言,我会忽略“alpha”标记 – 它只是开源版本是“alpha”,它是基于一个非常稳定和大量使用的内部API 。)

使用方法链接的扩展方法。

 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

另一种方式,在C#/。净find小奇迹 :

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

我有这个小function:

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

既然它没有规定一个具体的返回types,那么这个generics就可以在所有的地方使用。 你的代码看起来像

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

但当然也允许

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

当我必须在LINQ语句的输出中添加/添加一个项目时,我经常使用它。 例如要将一个空白项目添加到select列表中:

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

保存一些ToList()Add语句。

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

你也可以做

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

我会做的

 var list = new List<string> { "hello" }; 
 new[] { "item" }.ToList(); 

比…短

 new List<string> { "item" }; 

而且您不必指定types。

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

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

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


在实践中,我实际上将其命名为Create与我定义的其他帮助对象,如Lazy.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); } } 

对于在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; } } 

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

试试var

 var s = new List<string> { "a", "bk", "ca", "d" };