代码之家  ›  专栏  ›  技术社区  ›  Edward Tanguay

如何在LINQ中定义变量?

  •  20
  • Edward Tanguay  · 技术社区  · 15 年前

    此代码:

    string[] files = {"test.txt", 
        "test2.txt", 
        "notes.txt", 
        "notes.doc", 
        "data.xml", 
        "test.xml", 
        "test.html", 
        "notes.txt", 
        "test.as"};
    
    files.ToList().ForEach(f => Console.WriteLine(
            f.Substring(
                f.IndexOf('.') + 1, 
                f.Length - f.IndexOf('.') - 1
                )
        ));
    

    生成此列表:

    txt
    txt
    txt
    doc
    xml
    xml
    html
    txt
    as
    

    有什么办法吗 f.IndexOf('.') 变量 所以在更复杂的LINQ查询中,我在一个地方定义了这个?

    3 回复  |  直到 11 年前
        1
  •  53
  •   Greg Beech    15 年前

    如果您使用LINQ,那么可以使用 let 用于定义内联变量的关键字(问题中发布的代码实际上没有使用LINQ)。

    var ext = from file in files
              let idx = f.LastIndexOf('.') + 1
              select file.Substring(idx);
    

    但是对于您发布的特定场景,我建议使用 Path.GetExtension 而不是自己分析字符串(例如,如果任何文件 . 在文件名中)。

    var ext = from file in files select Path.GetExtension(file).TrimStart('.');
    foreach (var e in ext)
    {
        Console.WriteLine(e);
    }
    
        2
  •  9
  •   Brian Rasmussen    11 年前

    你可以这样做

    files.ToList().ForEach(f => { var i = f.IndexOf('.'); 
       Console.WriteLine(f.Substring(i + 1, f.Length - i - 1));}
    );
    
        3
  •  2
  •   Svish    15 年前

    如果你不想使用 from 有点语法,你可以用 Select 方法:

    var extensions = files
            .Select(x => new { Name = x, Dot = x.IndexOf('.') + 1 })
            .Select(x => x.Name.Substring(x.Dot));
    

    不过,和Greg一样,我建议使用 Path.GetExtension 方法。用这种方法:

    var extensions = files
            .Select(x => Path.GetExtension(x));
    

    在这种情况下,我真的认为这比建议的LINQ语句更容易阅读。


    要将其写入控制台,可以执行以下操作:

    extensions
        .ToList()
        .ForEach(Console.WriteLine);