1

次のような文字列のリストがあります。

  • 文字列1
  • 文字列1.文字列2
  • 文字列1.文字列2.文字列3
  • その他1
  • その他1.その他2
  • テスト1
  • スタッフ1.スタッフ1
  • テキスト1.テキスト2.テキスト3
  • フォルダー1.フォルダー2.フォルダーA
  • フォルダー1.フォルダー2.フォルダーB
  • フォルダー1.フォルダー2.フォルダーB.フォルダーC

これを次のようにグループ化します。

  • 文字列1.文字列2.文字列3
  • その他1.その他2
  • テスト1
  • スタッフ1.スタッフ1
  • テキスト1.テキスト2.テキスト3
  • フォルダー1.フォルダー2.フォルダーA
  • フォルダー1.フォルダー2.フォルダーB.フォルダーC

「String1」が次の項目「String1.String2」にある場合、最初の項目は無視され、2 番目の項目が 3 番目の項目にある場合は、3 番目の「String1.String2.String3」のみが取得されます (n 個の項目)。文字列はノード/パスのような構造で、ドットで分割できます。

フォルダーの例でわかるように、Folder2 には 2 つの異なるサブフォルダー アイテムがあるため、両方の文字列が必要になります。

Linqでこれを処理する方法を知っていますか? 私は VB.Net を好みますが、C# も問題ありません。

よろしくアトゥー

4

4 に答える 4

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)います。

于 2013-03-22T12:26:02.127 に答える
0

かなり単純なもの。これを試して:

var lst = new List<string> { /*...*/ };

var sorted =
    from item in lst
    where lst.Last() == item || !lst[lst.IndexOf(item) + 1].Contains(item)
    select item;
于 2013-03-22T12:20:17.133 に答える
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();
于 2013-03-22T12:22:33.840 に答える