当我尝试编译代码时出现以下错误:
方法的类型参数 “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();
我不知道如何能够进一步“输入”这个......
答案 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>>
,因为块中的某些返回类型不能隐式转换为委托返回类型
这可能会引导你到达其他答案 - 你试图调用一个预期序列的方法,但是你给它一个对象。
(或者在尝试确定要添加的类型参数时,您会更快意识到错误。)