无法从使用情况中推断出SelectMany

时间:2014-08-29 08:24:48

标签: c# linq

当我尝试编译代码时出现以下错误:

  

方法的类型参数   “System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,   System.Func&GT)”   无法从使用中推断出来。尝试指定类型参数   明确。

        List<RowEntry> entries = ...
        List<RowArgument> arguments = ...

        var argumentsVal = entries.SelectMany((RowEntry entry) =>
            (IEnumerable<RowArgumentVal>)arguments.SelectMany((RowArgument arg) => 
            new RowArgumentVal()
            {
                Action = "X" 
                , EntryID = entry.ID
                , ArgID = arg.ID
                , Val_BIT = true
                , Val_DATE = new DateTime(2014, 01, 04)
                , Val_DATETIME = new DateTime(2014, 01, 04)
                , Val_DECIMAL = 4.6M
                , Val_INT = 88
                , Val_TIME = new TimeSpan(6, 0, 0)
            }
        ).Cast<RowArgumentVal>()).Cast<RowArgumentVal>().ToList();

我不知道如何能够进一步“输入”这个......

4 个答案:

答案 0 :(得分:19)

问题是内部SelectMany不适用于那里,你可能意味着Select

var argumentsVal = entries.SelectMany(entry =>
    arguments.Select(arg => new RowArgumentVal())).ToList();

根据entry,每个IEnumerable<RowArgumentVal>都会映射到arguments

想象一下外部SelectMany是一个简单的Select,它会生成List<IEnumerable<RowArgumentVal>>。但由于它是SelectMany,它会将结果“扁平化”为简单的List<RowArgumentVal>

SelectMany方法需要映射到IEnumerable<T> - 而不是T。如果RowArgumentVal恰好实现了IEnumerable<T>接口,那么您的原始代码将是有效的,我认为不是这样。

答案 1 :(得分:2)

这似乎是两个列表中的笛卡尔积,因为它们之间没有关系。你可能想加入他们,但不清楚如何。

以下是生成笛卡尔积的更具可读性和编译方式:

var query = from entry in entries
            from argument in arguments
            select new RowArgumentVal
            {
               Action = "X", EntryID = entry.ID,  ArgID = argument.ID, // ...
            };

List<RowArgumentVal> argumentsVal = query.ToList();

答案 2 :(得分:1)

如果您想要笛卡尔产品,请尝试执行以下操作

 var argumentsVal = from e in entries
    from a in arguments
    select new RowArgumentVal(...)

答案 3 :(得分:0)

顺便说一下,&#34;进一步打字&#34;你可以做的就是给泛型方法调用提供类型参数。特别是,如果您已将第二个SelectMany更改为SelectMany<RowArgument, RowArgumentVal>,则会出现错误

  

无法将RowArgumentVal类型隐式转换为System.Collections.Generic.IEnumerable<RowArgumentVal>。存在显式转换(您是否错过了演员?)

     

无法将lambda表达式转换为委托类型System.Func<RowArgument,int,System.Collections.Generic.IEnumerable<RowArgumentVal>>,因为块中的某些返回类型不能隐式转换为委托返回类型

这可能会引导你到达其他答案 - 你试图调用一个预期序列的方法,但是你给它一个对象。

(或者在尝试确定要添加的类型参数时,您会更快意识到错误。)