【问题标题】:Linq to split/analyse substringsLinq 拆分/分析子字符串
【发布时间】:2013-03-22 11:54:07
【问题描述】:

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

  • 字符串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# 也可以。

问候阿图

【问题讨论】:

    标签: string linq split group-by


    【解决方案1】:
        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) 时间可用。

    【讨论】:

    • 如果 List(of String) 已排序,这将运行良好。谢谢。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      很简单的一个。试试这个:

      var lst = new List<string> { /*...*/ };
      
      var sorted =
          from item in lst
          where lst.Last() == item || !lst[lst.IndexOf(item) + 1].Contains(item)
          select item;
      

      【讨论】:

      • 效率极低! Last() 每次都会枚举整个集合! IndexOf() 也是线性的。
      • 你会得到一个 ArgumentOutOfRange 异常。
      • @Phil:我添加了list.Last() == item 以免出现异常,在 LinqPad 中工作。
      • @MarcinJuraszek:不正确。如果source 实现IList&lt;T&gt; Last 使用Count 和索引器。然而,这是一个实现细节,所以也许不应该依赖它......
      • @jaydotnet:您需要对您的帖子进行编辑,以便我可以删除我的反对票,尽管我认为您应该使用 StartsWith not Contains。
      【解决方案4】:

      以下简单的行可以解决问题,我不确定性能成本通过

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

      【讨论】:

        猜你喜欢
        • 2012-01-29
        • 1970-01-01
        • 2011-12-08
        • 2011-10-30
        • 2019-05-22
        • 2016-04-28
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多