【问题标题】:Filter a string using LINQ使用 LINQ 过滤字符串
【发布时间】:2019-08-03 07:17:35
【问题描述】:

我在编码面试中遇到了这个问题,我需要过滤字符串列表并返回一个排序后的枚举,其中字符串以“L”开头,但是如果在调用之后修改字符串列表,我的解决方案应该可以工作没有使用toList()的Filter方法,最后一个条件我没看懂。

目前我可以找到以“L”开头的排序字符串。

/**C# method**/        
public static IEnumerable<string> Filter(List<string> strings)
{
     return strings.Where(i => i.StartsWith("L") || i.StartsWith("l")).OrderBy(x => x);
}

我需要理解最后一句话的意思: 如果在调用 Filter 方法后修改了字符串列表而不使用 ToList(),则您的解决方案应该可以工作。

【问题讨论】:

  • 他们是否提供了任何输入和预期输出?
  • 他们提供这个作为输出示例:Litch,Lobster。但作为输入,它们会给出一个正常的字符串列表。
  • 请用提供的输入和预期输出更新您的问题,以便我们清楚地理解您的问题

标签: c# string list linq ienumerable


【解决方案1】:

如果您了解 Linq 的幕后工作原理,他们最有可能看到这里的内容。

IEnumerable 接口不仅允许循环执行某些内容,还可以用于延迟执行。这意味着实际代码在枚举之前不会执行(例如循环或.ToList() 调用)。

那么这与您的问题有什么关系?好吧,既然它在循环之前没有被执行,我们实际上可以使用列表调用 Filter() 方法并保留对可枚举的引用,然后在我们实际循环遍历可枚举之前更改源列表。

using System;
using System.Collections.Generic;
using System.Linq;

class MainClass {
    public static void Main (string[] args) {
        var list = new List<string> { "Lambda", "Aardvark", "Lexicon" };

        // This is now just an IEnumerable that will
        // call Where() and OrderBy() when it is enumerated.
        var filteredEnum = Filter(list);

        list.RemoveAt(1);
        list.Add("Leisure");

        // This is where the actual enumeration happens
        // which then executes the Linq methods.
        foreach(var word in filteredEnum)
            Console.WriteLine(word);

    }

    public static IEnumerable<string> Filter(List<string> strings)
    {
        return strings.Where(i => i.StartsWith("L") || i.StartsWith("l")).OrderBy(x => x);
    }
}

试试https://repl.it/repls/CautiousFrankLaw

所以在下一次面试之前,你可能想多看看deferred execution and linq,这样你下次就可以成功了。

【讨论】:

  • 非常感谢,您的解释帮助我了解了幕后发生的事情。
  • 如果您对答案感到满意,则可以通过单击左侧答案分数下方的复选标记将其标记为“已接受”。
猜你喜欢
  • 2015-10-30
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
相关资源
最近更新 更多