将字符串列表中的索引中的字符转换为一个字符列表

时间:2013-05-09 01:08:13

标签: c# linq anonymous-types sublist

标题听起来像废话,但下面的例子有望帮助。

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

2 个答案:

答案 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>的集合。

您可以在indiceswords之间切换以获得不同顺序的字符:

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];