在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.Create
, Lazy.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" };