【问题标题】:IEnumerable Concat Missing, does not contain a definition for 'Concat'IEnumerable Concat Missing,不包含“Concat”的定义
【发布时间】:2015-11-01 09:38:34
【问题描述】:

我有以下继承 IEnumerable 的类

public class LinesEnumerable : IEnumerable<Point>
{
    protected readonly IPointSeries _pointSeries;
    protected readonly ICoordinateCalculator<double> _xCoordinateCalculator;
    protected readonly ICoordinateCalculator<double> _yCoordinateCalculator;
    protected readonly bool _isDigitalLine;

    /// <summary>
    /// Initializes a new instance of the <see cref="LinesEnumerable" /> class.
    /// </summary>
    /// <param name="pointSeries">The point series.</param>
    /// <param name="xCoordinateCalculator">The x coordinate calculator.</param>
    /// <param name="yCoordinateCalculator">The y coordinate calculator.</param>
    /// <param name="isDigitalLine">if set to <c>true</c> return a digital line .</param>
    public LinesEnumerable(IPointSeries pointSeries, ICoordinateCalculator<double> xCoordinateCalculator, ICoordinateCalculator<double> yCoordinateCalculator, bool isDigitalLine)
    {
        _pointSeries = pointSeries;
        _xCoordinateCalculator = xCoordinateCalculator;
        _yCoordinateCalculator = yCoordinateCalculator;
        _isDigitalLine = isDigitalLine;
    }

    /// <summary>
    /// Returns an enumerator that iterates through a collection.
    /// </summary>
    /// <returns>
    /// An <see cref="T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
    /// </returns>
    public virtual IEnumerator<Point> GetEnumerator()
    {
        return _isDigitalLine ?
            (IEnumerator<Point>)new DigitalLinesIterator(_pointSeries, _xCoordinateCalculator, _yCoordinateCalculator) :
            new LinesIterator(_pointSeries, _xCoordinateCalculator, _yCoordinateCalculator);
    }

    /// <summary>
    /// Returns an enumerator that iterates through a collection.
    /// </summary>
    /// <returns>
    /// An <see cref="T:System.Collections.IEnumerator" /> object that can be used to iterate through the collection.
    /// </returns>
    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

但是,当我尝试执行以下操作时:

linesEnumerable = linesEnumerable.Concat(new[] { new Point(viewportWidth, lastYCoordinate) });

它说'System.Collections.IEnumerable'不包含'Concat'的定义和最佳扩展方法重载'System.Linq.Queryable.Concat(System.Linq.IQueryable, System.Collections.Generic.IEnumerable) ' 有一些无效的参数

我已经添加了 System.Linq 命名空间

有人知道为什么会这样吗?

【问题讨论】:

  • 确保使用 System.Linq 命名空间。它包含 Enumerable 类,其中包含 IEnumerable 类的扩展方法。
  • linesEnumerable 是什么?是IEnumerable 还是IEnumerable&lt;Point&gt;
  • 它是 IEnumerable
  • 我已经有 System.Linq 命名空间

标签: c# wpf linq


【解决方案1】:

当两个集合的类型不同T 时,编译器会给出这个错误。例如:

List<int> l1 = new List<int>();
List<string> l2 = new List<string>();

var l3 = l1.Concat(l2);
var l4 = l1.Union(l2);

ConcatUnion 调用将分别导致以下编译时错误:

“List”不包含“Concat”的定义,最佳扩展方法重载“Queryable.Concat(IQueryable, IEnumerable)”需要“IQueryable”类型的接收器

'List' 不包含'Union' 的定义,并且最佳扩展方法重载'Queryable.Union(IQueryable, IEnumerable)' 需要'IQueryable' 类型的接收器

这很令人困惑,因为该消息具有误导性,并且 VS intellisense 可以识别扩展方法。解决办法是l1l2必须是T类型相同的列表。

【讨论】:

  • 我发现最常见的情况是,我尝试Concat 一个IEnumerable&lt;T&gt; 和一个IEnumerable&lt;IEnumerable&lt;T&gt;&gt; 对象。我通常使用Select,我的意思是SelectMany
【解决方案2】:

嗯,这对你没有帮助,但是当你用谷歌搜索错误时,这个问题是最好的结果,所以我要说我的问题是什么。

我有以下课程:

class Group
class Row : Group
class Column : Group

我试图用IEnumerable&lt;Column&gt;IEnumerable&lt;Row&gt; 上调用Concat,以获取IEnumerable&lt;Group&gt;。这不起作用,因为您无法将列转换为行。解决方案是将我的 IEnumerable&lt;Row&gt; 转换为 IEnumerable&lt;Group&gt;

例如rows.Cast&lt;Group&gt;().Concat(columns)

【讨论】:

  • 这个解决方案启发我查看我的集合的类型,以确保它们甚至可以被连接。虽然它们是相同的类型,但我使用的是隐式类型的数组和显式类型的数组。将隐式类型更改为显式类型修复了错误。所以(new byte[] { 0x00 }).Concat(new[] { 0x00 }); 更改为(new byte[] { 0x00 }).Concat(new byte[] { 0x00 });
猜你喜欢
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 2021-07-11
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多