在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");
是否有更短/更清洁的方式?
感谢。
答案 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)
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
函数*)对齐:/ p>
namespace System.Collections.Generic
{
public static class List
{
public static List<T> Singleton<T>(T value) => new List<T>(1) { value };
}
}
*当然除了ResizeArray
本身,因此这个问题:)
在实践中,我实际将其命名为Create
,以便与我定义的其他帮助程序对齐,例如Tuple.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);
}
}
答案 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!");