0

标题听起来像废话,但下面的示例希望能有所帮助。

尝试编写一个大的 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);
4

2 回答 2

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>.

您可以在indiceswords以不同的顺序获取字符:

var chars = words.SelectMany(w => indices.Where(i => i < w.Length)
                                         .Select(i => w[i])).ToList();
Console.WriteLine(string.Join(",", chars)); // lord
于 2013-05-09T01:12:13.250 回答
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];
于 2013-05-09T01:52:57.077 回答