将if子句合并到linq中

时间:2014-02-03 10:21:19

标签: c# asp.net linq

我正在开发一个函数,它在文本文件中读取url,更新链接,然后将数据写回。

读完一行后,我找到第三个'/',从链接中删除剩余的字符,然后将列表区分开来。从理论上讲,这应该是一个子域名列表。

但是,我想检查该行是否为空并且第3个'/'是否存在。如果不是,则返回-1.IndexofNth将返回-1。

我正在努力弄清楚如何最好地将这种逻辑融入到我所拥有的或不同的结构中。

    protected void Page_Load(object sender, EventArgs e)
    {
        var fileName = @"c:\badlinks.txt";

        List<string> urls = File.ReadAllLines(fileName).ToList();

        urls = urls
            .Select(x =>
                x.Replace(x, x.Substring(0, IndexOfNth(x, '/', 3))))
                .Distinct()
                .ToList();

        File.WriteAllLines(fileName, urls);
    }

提前致谢。

3 个答案:

答案 0 :(得分:1)

urls = urls
        .Select(x => IndexOfNth(x, '/', 3) != -1 
                x.Replace(x, x.Substring(0, IndexOfNth(x, '/', 3))
                : null ))
        .Where(x => x != null)
        .Distinct()
        .ToList();

答案 1 :(得分:1)

这应该有所帮助。

urls = urls
       .Where(x => !string.IsNullOrWhiteSpace(x))
       .Select(x =>IndexOfNth(x, '/', 3)<0?
                   x:
                   x.Replace(x, x.Substring(0, IndexOfNth(x, '/', 3))))
       .Distinct()
       .ToList();

答案 2 :(得分:0)

在进行字符串操作之前过滤列表。

urls = urls
        .Where(x => x.Length > 0)
        .Select(x => x.Substring(0, IndexOfNth(x, '/', 3) > -1 ? x.Replace(x, x.Substring(0, IndexOfNth(x, '/', 3)))  : x)
            .Distinct()
            .ToList();

将逻辑移动到新方法以保持代码清洁是个明智之举。

    urls = urls
        .Where(x => x.Length > 0)
        .Select(x => ManinpulateMyUrl(x))
            .Distinct()
            .ToList();


    private string ManipulateMyUrl(string url) {
      var index = IndexOfNth(x, '/', 3);
      if (index == -1) return url;
      return url.Substring(0, IndexOfNth(x, '/', 3);
    }