2013-05-09 126 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];