Linq分裂/分析子串

时间:2013-03-22 11:54:07

标签: string linq split group-by

我有一个字符串列表,如:

  • 字符串1
  • String1.String2
  • String1.String2.String3
  • 其他1
  • Other1.Other2
  • 测试1
  • Stuff1.Stuff1
  • Text1.Text2.Text3
  • Folder1.Folder2.FolderA
  • Folder1.Folder2.FolderB
  • Folder1.Folder2.FolderB.FolderC

现在我想把它归为:

  • String1.String2.String3
  • Other1.Other2
  • 测试1
  • Stuff1.Stuff1
  • Text1.Text2.Text3
  • Folder1.Folder2.FolderA
  • Folder1.Folder2.FolderB.FolderC

如果 “String1”在下一项“String1.String2”中我将忽略第一项 如果第二个项目在第三个项目中我将只采取第三个“String1.String2.String3” 等等(n项)。字符串的结构类似于节点/路径,可以用点分割。

正如您在文件夹示例中所看到的,Folder2有两个不同的子文件夹项,因此我需要两个字符串。

你知道如何用Linq处理这个问题吗?我更喜欢VB.Net,但C#也没关系。

关心Athu

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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();

答案 2 :(得分: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)时间可用。

答案 3 :(得分: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);