标题听起来像废话,但下面的例子有望帮助。
尝试编写一个大的LINQ语句,给定一个字符串列表和一个整数列表,它可以将该列表中所有字符的列表收集到一个中。例如:
指数:
{2,4}
可能的:
{"hello","world"}
应该给我:
{'l','o','r','d'}
来自每个字符串中的索引2和4。
我想我有点不对劲,但这是一个混乱的陈述,我正在努力提供一些工作/正确:
var lettersToCheckOut = possible.Select(s => s.ToCharArray()).Select((c, index) => new
{
let = c,
ind = index
}).Where(c => indices.Contains(c.ind)).Select(c => c.let);
答案 0 :(得分:3)
那样的东西?
var chars = indices.SelectMany(i => words.Where(w => i < w.Length)
.Select(w => w[i])).ToList();
Console.WriteLine(string.Join(",", chars)); // lrod
逻辑如下:
对于每个索引,我想查看所有可能的单词,并收集字符。
首先,我必须检查索引是否在当前单词的范围内。
从每个单词中,我将索引为当前索引的字符。
使用SelectMany
方法,我获得了一组字符,而不是IEnumerable<char>
的集合。
您可以在indices
和words
之间切换以获得不同顺序的字符:
var chars = words.SelectMany(w => indices.Where(i => i < w.Length)
.Select(i => w[i])).ToList();
Console.WriteLine(string.Join(",", chars)); // lord
答案 1 :(得分:0)
我知道问题已经得到解答,但这是使用Linq查询理解语法的替代解决方案。我个人认为它更优雅,并且在其他人也这样做的时候分享它:
var words = new[] { "Hello", "World" };
var indexes = new[] { 2, 4 };
//{ 'l', 'o', 'r', 'd' }
var output =
from word in words
from index in indexes
where word.Length > index
select word[index];