我有一个字符串列表,如:
现在我想把它归为:
如果 “String1”在下一项“String1.String2”中我将忽略第一项 如果第二个项目在第三个项目中我将只采取第三个“String1.String2.String3” 等等(n项)。字符串的结构类似于节点/路径,可以用点分割。
正如您在文件夹示例中所看到的,Folder2有两个不同的子文件夹项,因此我需要两个字符串。
你知道如何用Linq处理这个问题吗?我更喜欢VB.Net,但C#也没关系。
关心Athu
答案 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)
,因此Count
和input(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);