2013-03-22 99 views
1

我有一樣的字符串列表:LINQ到拆分/分析子

  • String1中
  • String1.String2
  • String1.String2.String3
  • 其他1
  • Other1.Other2
  • Test1
  • Stuff1.Stuff1
  • Text1.Text2.Text3
  • Folder1.Folder2.FolderA
  • Folder1.Folder2.FolderB
  • Folder1.Folder2.FolderB.FolderC

現在,我想這組成:

  • String1.String2.String3
  • Other1.Other2
  • Test1的
  • Stuff1.Stuff1
  • Text1.Text2.Text3
  • Folder1.Folder2.FolderA
  • Folder1.Folder2.FolderB.FolderC

如果 「字符串1」 是下一個項目「String1中.String2「我將忽略第一個 ,如果第二個項目在第三個中,我將僅接受第三個」String1.String2.String3「 等等(n項)。字符串的結構類似於節點/路徑,可以用點分隔。

正如您可以看到的文件夾示例Folder2有兩個不同的子文件夾項目,所以我會需要兩個字符串。

你知道如何處理這與Linq?我寧願VB.Net,但C#也可以。

Regards Athu

回答

0
Dim r = input.Where(Function(e, i) i = input.Count - 1 OrElse Not input(i + 1).StartsWith(e + ".")).ToList() 

條件中Where方法檢查元素是最後一個從輸入或後面沒有元素,包含當前的一個。

該解決方案使用的事實,即輸入List(Of String),所以Countinput(i+1)可在O(1)時間。

+0

如果列表(字符串)是排序的,這很好。謝謝。 – Athu 2013-03-22 15:43:44

0

很簡單。試試這個:

​​
+0

效率非常低! 'Last()'每次都會枚舉整個集合! IndexOf()也是線性的。 – MarcinJuraszek 2013-03-22 12:27:28

+0

你會得到一個ArgumentOutOfRange異常。 – Phil 2013-03-22 12:29:12

+0

@Phil:我添加了'list.Last()== item'不會得到異常,可以在LinqPad中使用。 – 2013-03-22 12:30:12

0

LINQ在這裏並不是真正的方法,因爲你需要一次訪問多個項目。

我會去像這樣的東西:

public static IEnumerable<string> Filter(this IEnumerable<string> source) 
{ 
    string previous = null; 
    foreach(var current in source) 
    { 
     if(previous != null && !current.Contains(previous)) 
      yield return previous; 
     previous = current; 
    } 
    yield return previous; 
} 

用法:

var result = strings.Filter(); 
0

下面簡單的線條可以做的伎倆,我不知道有關性能的成本通過

 List<string> someStuff = new List<string>(); 
     //Code to the strings here, code not added for brewity 
     IEnumerable<string> result = someStuff.Where(s => someStuff.Count(x => x.StartsWith(s)) == 1);