为什么这个LINQ Select表达式不起作用

时间:2016-06-11 18:28:54

标签: c# linq select

我有一个困难的LINQ表达式,我无法弄清楚它为什么不起作用。我得到的语法错误是

  

Enumerable.Select<TSource, TResult>(IEnumerable<TSource>, Func<TSource, TResult>)的参数类型不能   从用法推断。尝试指定类型参数   明确。

错误发生在第二个Select语句x.Select上。我正在尝试从allFactors中抓取每个列表列表中的一个元素,并将它们添加到一起,并保留在tempList中添加到一起的每个分组。换句话说,我想在tempList中将各个元素保持在一起,并在temp中了解它们的总数。

代码allFactors的早期版本中填充了值。如何明确指定类型或以其他方式执行此操作。我无法理解为什么它也没有推断出类型。

int temp = 0;
//List<List<int>> allFactors = new List<List<int>>();
List<int> tempList = new List<int>();
allFactors.Select(x => x.Select(y => { temp += y; tempList.Add(y); }));

编辑: 大卫的答案确实解决了语法错误!不幸的是,通过进一步的测试,我意识到我的代码没有做我想做的事情。我真正想要的是获得每个排列,其中每个组仅由列表列表中的一个元素组成。举个例子:

List<List<int>> oldList = {{1,2},{3,4}};
List<List<int>> newList = {{1,3},{1,4},{2,3},{2,4}};

我正在寻找将oldList转换为newList的方法。挑战在于我不知道将有多少嵌套列表或每个列表中有多少项。有任何想法吗?感谢大家到目前为止的想法。

2 个答案:

答案 0 :(得分:4)

无法推断类型,因为您没有通过内部选择返回任何内容。作为结果,编译器没有任何东西要推断外部选择。

此外,由于您未使用所选的回报,因此可以使用.ForEach()代替。

int temp = 0;
List<List<int>> allFactors = new List<List<int>>();
List<int> tempList = new List<int>();
allFactors.ForEach(x => x.ForEach(y => { temp += y; tempList.Add(y); }));

如果您想坚持.Select(),则需要从内部选择中返回值,并使用.SelectMany()作为外部选择。

int temp = 0;
List<List<int>> allFactors = new List<List<int>>();
List<int> tempList = new List<int>();
List<int> selectedList = allFactors.SelectMany(x => x.Select(y => 
                { 
                    temp += y;    
                    tempList.Add(y); 
                    return y; 
                })).ToList();

这将产生一个平坦的&#34; List<int>,这似乎与tempList的最终目标一致。

答案 1 :(得分:1)

如果你想要扁平化“allFactors”,你可以这样:

        var tempList = allFactors.SelectMany(x => x).ToList();
        var temp = tempList.Sum();

如果您只需要每个列表的第一个元素,那么它将是:

        var tempList = allFactors.Select(x => x.First()).ToList();
        var temp = tempList.Sum();