【问题标题】:Adding single item to enumerable将单个项目添加到可枚举
【发布时间】:2012-07-13 20:10:18
【问题描述】:

有没有比这个更优雅的向 IEnumerable 添加项目的解决方案

myNewIEnumerable = myIEnumerable.Concat ( Enumerable.Repeat (item, 1) );

?

一些上下文:

public void printStrings (IEnumerable<string> myStrings) {
   Console.WriteLine ("The beginning.");
   foreach (var s in myStrings) Console.WriteLine (s);
   Console.WriteLine ("The end.");
}

...

var result = someMethodDeliveringAnIEnumerableOfStrings ();
printStrings (result.Concat ( Enumerable.Repeat ("finished", 1) ) );

【问题讨论】:

  • 可能不是,IEnumerable 是错误的媒介。显示更多上下文以获得更好的答案。
  • 上下文不佳。您可以(并且更好)在这里使用额外的 WriteLine()。
  • @Henk,是的,这个例子有点令人失望。我期待将更多的数据点注入到现有的查询中,而减少对控制台的写入。
  • 好的,我为你们更改了示例,使得在 printStrings 之外调用 WriteLine 不再起作用。

标签: c# linq


【解决方案1】:

当然,有。 Concat() 接受任何 IEnumerable&lt;T&gt;,包括数组:

var myNewIEnumerable = myIEnumerable.Concat(new[] { item });

【讨论】:

  • 嗯,但这会创建一个数组!?我不确定这就是我想要的。
  • @Henk,难道Concat() 的性能不应该与耗尽myIEnumerable 然后产生item 的自定义迭代器块相媲美吗?
  • @JohnB,是的,这会创建一个包含一个元素的数组,这是我能想到的最简单的可枚举构造。
  • 是的,你当然是对的,但我真的很感激像 AppendItem 扩展函数这样的东西。
  • @FrédéricHamidi - 你可能是对的,使用结果应该只迭代原始一次。
【解决方案2】:

也许将单个元素附加到IEnumerable&lt;T&gt; 的最简单方法是使用此AsIEnumerable 扩展(尽管Eric Lippert advises against 为对象创建扩展):

public static IEnumerable<T> AsIEnumerable<T>(this T obj)
{
    yield return obj;
}  

var appended = source.Concat(element.AsIEnumerable())

或使用此Append&lt;T&gt; 扩展名:https://stackoverflow.com/a/3645715/284240

【讨论】:

  • AsEnumerable () 是我正在寻找的。非常感谢!
  • 只是一个评论:正如我刚刚注意到的,重要的是不要将 AsIEnumerable 与 AsEnumerable 混淆!当然,它必须是 AsIEnumerable。
  • @JohnB:嗯,这是这个答案(和你的问题)的核心,因为单个对象永远不是它的类型的 IEnumerable 并且没有 AsEnumerable() 方法。我们可以将其重命名为AsEnumerable,但这可能会导致更多误解。
【解决方案3】:

您可以像这样定义自己的 SingleConcat 扩展方法

public static class CustomConcat
    {
        public static IEnumerable<T> SingleConcat<T>(this IEnumerable<T> first, T lastElement)
        {
            foreach (T t in first)
            {
                yield return t;
            }

            yield return lastElement;
        }
    }

    class Program
    {


        static void Main(string[] args)
        {
            List<int> mylist = new List<int> { 1 , 2 , 3};

            var newList = mylist.SingleConcat(4);

            foreach (var s in newList)
            {
                Console.WriteLine(s);
            }

            Console.Read();
        }
    }

这应该打印 1,2,3 后跟一个 4

【讨论】:

    猜你喜欢
    • 2021-05-27
    • 1970-01-01
    • 2021-06-14
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多