从单个值创建新的IEnumerable <T>序列的最佳方法?


97

我通常使用数组语法从单个值创建一个序列,如下所示:

IEnumerable<string> sequence = new string[] { "abc" };

或使用新的列表。我想听听是否有人有一种更具表现力的方式来做同样的事情。


3
空序列如何?
CoderDennis

令人尴尬的是,dotnet仍然没有这样的东西Enumerable.From<T>(params T[] items)
晚安书呆子骄傲

Answers:


144

您的示例不是空序列,而是具有一个元素的序列。要创建一个空字符串序列,您可以执行

var sequence = Enumerable.Empty<string>();

EDIT OP阐明了他们希望创建一个单一的价值。在这种情况下

var sequence = Enumerable.Repeat("abc",1);

D'哦,我很分心,对不起。我的意思是从单个值创建,而不是创建空实例!
Marcel Lamothe

这是“答案”标志吗?
n8wrl

该方法比创建新数组更纯粹。
罗伊·廷克

69

我喜欢您的建议,但省略了数组类型:

var sequence = new[] { "abc" };

4
我从未意识到您可以做到。我认为这比使用重复更清晰。
Marcel Lamothe 2009年

1
但这不是IEnumerable,而是一个数组!
Zodman

4
@Bryan Watts我知道,但这是IEnumerable的具体实现。问题是要求IEnumerable <>(即使示例不是)。有区别。
Zodman

也许这个问题应该改变。
Zodman

1
@Jonesopolis:那是另一种不相关的情况。您可以使用它Task.FromResult来实现。
布赖恩·瓦茨

21

甚至更短

string[] single = { "abc" };

我会做一个扩展方法:

public static T[] Yield<T>(this T item)
{
    T[] single = { item };
    return single;
}

甚至更好或更短,

public static IEnumerable<T> Yield<T>(this T item)
{
    yield return item;
}

也许这正是幕后Enumerable.Repeat所做的。


1
最后一个是辉煌的。除了名称...,它将与已经实现IEnumerable的类型(例如您的示例中的字符串)冲突。尝试.AsSingleItemEnumerable()或简单地.Yield()->“ abc” .Yield()
DanO 2013年

7
我认为ToEnumerable更合适。
Zodman

2
+1 Yield是好的。我IEnumerable<T> Yield<T>(this T source, params T[] others)也是。
Jodrell 2014年

我试图完全放弃Yield以使用lambda,但是以某种方式从未编译过。stackoverflow.com/questions/1217729 / ... ;-)。
彼得-恢复莫妮卡2015年

@PeterSchneider您如何以及为什么这样做?没有看到代码,我无法发表评论。我不认为我会跟随你。
nawfal

5

或只是创建一个方法

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
    if(items == null)
        yield break;

    foreach (T mitem in items)
        yield return mitem;
}

要么

public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
{
   return items ?? Enumerable.Empty<T>();
}

用法:

IEnumerable<string> items = CreateEnumerable("single");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.