String Linq用于拆分/分析子字符串

String Linq用于拆分/分析子字符串,string,linq,split,group-by,String,Linq,Split,Group By,我有一个字符串列表,如: String1 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 St

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

String1 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 以此类推。字符串的结构类似于节点/路径,可以用点分割

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

你知道如何处理这件事吗?我更喜欢VB.Net,但C也可以


认为雅典大学很简单。试试这个:

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

var sorted =
    from item in lst
    where lst.Last() == item || !lst[lst.IndexOf(item) + 1].Contains(item)
    select item;

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;
}
条件,其中方法检查元素是输入的最后一个元素还是后面不跟包含当前元素的元素


该解决方案使用了一个事实,即输入是ListOf String,因此Count和inputi+1在O1时间可用。

下面这行简单的代码就可以解决这个问题,我不确定通过

        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);

效率很低!最后每次都会列举整个收藏!IndexOf也是线性的。您将获得ArgumentOutOfRange异常。@Phil:我添加了list。Last==项不获取异常,在LinqPad中工作。@MarcinJuraszek:不正确。如果源实现IList,则最后使用Count和索引器。然而,这是一个实现细节,所以也许你不应该依赖它…@jaydotnet:你需要对你的帖子进行编辑,这样我就可以删除我的否决票,尽管我认为你应该使用StartsWith not Contains。如果对字符串列表进行排序,这会很好地工作。非常感谢。
    Dim r = input.Where(Function(e, i) i = input.Count - 1 OrElse Not input(i + 1).StartsWith(e + ".")).ToList()
        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);