从字符串列表的索引中获取字符到一个字符列表中

本文关键字:列表 字符 一个 获取 字符串 索引 | 更新日期: 2023-09-27 18:12:59

标题听起来毫无意义,但下面的例子可能会有所帮助。

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

从字符串列表的索引中获取字符到一个字符列表中

是这样吗?

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

我知道这个问题已经得到了回答,但是这里有一个使用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];