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

Ser*_*ook 14 c# linq

我尝试编译代码时收到以下错误:

无法从用法中推断出方法'System.Linq.Enumerable.SelectMany(System.Collections.Generic.IEnumerable,System.Func>)'的类型参数.尝试显式指定类型参数.

        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();
Run Code Online (Sandbox Code Playgroud)

我不知道怎样才能"更进一步"这样做......

Sim*_*Var 22

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

var argumentsVal = entries.SelectMany(entry =>
    arguments.Select(arg => new RowArgumentVal())).ToList();
Run Code Online (Sandbox Code Playgroud)

每个entry将被映射到一个IEnumerable<RowArgumentVal>根据arguments.

想象一下,外部SelectMany是一个简单的Select,它会产生List<IEnumerable<RowArgumentVal>>.但是因为它是SelectMany,它会将结果"扁平化"成一个简单的结果List<RowArgumentVal>.

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