【问题标题】:Update IEnumerable with new object in extension method使用扩展方法中的新对象更新 IEnumerable
【发布时间】:2012-07-16 06:52:19
【问题描述】:

我想将新的 iEnumerable 对象添加到原始对象。我可以像下面这样在扩展方法中更新原始对象吗?

public static void AddItems<TSource>(this IEnumerable<TSource> orginalColl,    
IEnumerable<TSource> collectionToAdd)
{
foreach (var item in collectionToAdd)
{
    orginalColl.ToList<TSource>().Add(item);             
}             
}

我这样调用:OrgCollecation.AddItems(newCollection)。 但这似乎不起作用。有什么想法吗?

【问题讨论】:

    标签: c# extension-methods ienumerable


    【解决方案1】:

    IEnumerable[&lt;T&gt;] 不适合添加。您可以连接(生成新序列),但这不会改变原始序列(/list/array/etc)。您可以使用Enumerable.Concat 来做到这一点,即return orginalColl.Concat(...)。但强调:这不会更新原始集合

    可以做的是将转换为IList[&lt;T&gt;] 或类似的,但这将是滥用(并且仅适用于某些情况,而不是全部)。例如,对于任何基于迭代器块(或任何其他不是 IList&lt;T&gt;IEnumerable&lt;T&gt;)的东西,它都不起作用 - 例如,它不适用于 someSource.Where(predicte)

    如果您希望更改源,那么您应该传入类似IList[&lt;T&gt;] 的内容。例如:

    public static void AddItems<TSource>(this IList<TSource> orginalColl,
        IEnumerable<TSource> collectionToAdd)
    {
        foreach (var item in collectionToAdd)
        {
            orginalColl.Add(item);             
        }             
    }
    

    (顺便说一句,AddRange 将是上述名称的替代名称,以匹配 List&lt;T&gt;.AddRange

    【讨论】:

      【解决方案2】:

      不,你不能。 在您的代码中,您将可枚举源克隆到列表中,然后向其中添加元素并忘记,因为您没有返回任何内容。

      试试

      var result = orginalColl.Concat(collectionToAdd);
      

      查看http://msdn.microsoft.com/en-us/library/bb302894.aspx 了解更多信息和示例。

      【讨论】:

        【解决方案3】:

        简而言之,IEnumerable&lt;T&gt; 应该被认为是不可变的,并且您不能添加它。您不知道实现它的是哪种集合,例如,它可能是串行端口输入或您正在枚举的文件系统中的只读文件。

        您尝试对集合执行的操作更符合ICollection&lt;T&gt; 的用例;它由框架中的通用(可变)集合实现。

        public static void AddItems<TSource>(this ICollection<TSource> orginalColl,
                IEnumerable<TSource> collectionToAdd)
        {
            foreach (var item in collectionToAdd)
            {
                orginalColl.Add(item);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-25
          • 1970-01-01
          • 1970-01-01
          • 2019-03-17
          • 2020-03-28
          • 2018-09-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多