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”中,我将忽略第一项,如果第二项在第三项中,我将只取第三项“String1.String2.String3”,依此类推(n 项)。该字符串的结构类似于节点/路径,可以用点分隔。

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

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

问候阿图

4

4 回答 4

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 回答
0
    Dim r = input.Where(Function(e, i) i = input.Count - 1 OrElse Not input(i + 1).StartsWith(e + ".")).ToList()

方法内的条件Where检查元素是来自输入的最后一个元素还是后面没有包含当前元素的元素。

该解决方案使用了这样一个事实,即输入是List(Of String),所以Count并且input(i+1)是准时可用的O(1)

于 2013-03-22T12:26:02.127 回答
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);
于 2013-03-22T12:30:32.587 回答