2013-05-09 168 views
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); 
+0

而你的问题在这里? – MethodMan 2013-05-09 01:12:05

回答

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 
+0

字符的排列顺序与示例不同。不知道这是否重要。 – juharr 2013-05-09 01:14:13

+0

@juharr好点。需要注意的是,让他们在相同的顺序在OP的例子中,你只需要在我提供的代码的'indices'和'words'之间切换,让'words'将在outter循环,'indices'在内部循环(逻辑上)。 – SimpleVar 2013-05-09 01:17:22

+0

@YoryeNathan美丽,谢谢。另外,顺序并不重要,对不起,应该已经指定。 – Wilson 2013-05-09 01:19:34

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