Linq,流媒体&收集



我有这个方法返回一个字符串数组:

    private static string[] ReturnsStringArray()
    {
        return new string[]
        {
            "The path of the ",
            "righteous man is beset on all sides",
            "by the inequities of the selfish and",
            "the tyranny of evil men. Blessed is",
            "he who, in the name of charity and",
            "good will, shepherds the weak through",
            "the valley of darkness, for he is",
            "truly his brother's keeper and the",
            "finder of lost children. And I will ",
            "strike down upon thee with great",
            "vengeance and furious anger those",
            "who attempt to poison and destroy my",
            "brothers. And you will know my name",
            "is the Lord when I lay my vengeance", 
            "upon you"
        };
    }
}

我想写一个使用这个方法的方法。由于该方法返回的是一个数组而不是IEnumerable,是否有相同的结果可以这样写:

    private static IEnumerable<string> ParseStringArray()
    {
        return ReturnsStringArray()
            .Where(s => s.StartsWith("r"))
            .Select(c => c.ToUpper());
    }

和this:

    private static List<string> ParseStringArray()
    {
        return ReturnsStringArray()
            .Where(s => s.StartsWith("r"))
            .Select(c => c.ToUpper())
            .ToList(); // return a list instead of an IEnumerable.
    }

谢谢。

编辑

我的问题是:是否有任何兴趣或好处,方法ParseStringArray()返回一个IEnumerable而不是一个列表,因为这个方法调用ReturnsStringArray返回字符串数组,而不是IEnumerable

当您返回List时,您说"所有处理已完成,并且列表包含结果"。

但是,当您返回IEnumerable时,您在说"处理可能仍然需要完成"。

在您的示例中,当您返回IEnumerable时,.Where.Select尚未被处理。这就是所谓的"延迟执行"。
如果用户使用结果3次,那么.Where.Select将执行3次。这会产生很多棘手的问题。

我建议在从方法返回值时尽可能多地使用List。除了List提供的额外功能之外,.NET还有许多需要List的优化,调试支持更好,并且减少了意外副作用的可能性!

List是IEnumerable的具体实现。区别在于

1) IEnumerable仅仅是一个字符串序列,但List可以通过int索引进行索引,可以对其进行添加和删除,也可以在特定索引处插入项。

2)项可以用序列迭代,但不允许随机访问。List是一个特定的随机访问可变大小的集合。

我个人建议返回string[],因为您不太可能希望添加结果(忽略List<string>),但看起来您可能需要顺序访问(IEnumerable<string>不打算这样做)。是否推迟执行取决于你和情况;如果结果被多次使用,在返回结果之前调用ToArray()可能是明智的。

private static string[] ParseStringArray()
{
    return ReturnsStringArray()
        .Where(s => s.StartsWith("r"))
        .Select(c => c.ToUpper())
        .ToArray();
}

相关内容

  • 没有找到相关文章

最新更新