【问题标题】:Can I add an extension method to a LIST<>? [duplicate]我可以向 LIST<> 添加扩展方法吗? [复制]
【发布时间】:2019-06-27 10:23:39
【问题描述】:

我有这个代码:

public static List<Phrase> selectedPhrases;

if  (!App.selectedPhrases.Any(x => x.Viewed == false))
                return;

有什么方法可以改变我声明 selectedPhrases 的方式,以便我可以通过这种方式进行最后一次检查:

if  (App.selectedPhrases.AllViewed())
    return;

我听说过扩展方法,但是可以像在我的代码中那样为 List 创建一个吗?

【问题讨论】:

  • 你认为 Linq 是什么?
  • 是的,有可能。首先学习扩展方法的语法,然后尝试将其应用于List&lt;Phrase&gt;.

标签: c#


【解决方案1】:

您可以在 List 上编写扩展方法,例如 Phrase

public static class Extension
{
    public static bool AllViewed(this List<Phrase> source)
    {
        return source.All(x=>x.Viewed)
    }
}

顺便说一句,你不需要检查!Any(x=&gt;c.Viewed==false),上面的代码可以选择使用 .All() 扩展方法

您可以阅读更多关于扩展方法的语法here

您可能也有兴趣通过查看一些源代码 at referencesource 来了解 Linq 扩展方法是如何实现的。

【讨论】:

  • 这是一个很好的答案,我知道 OP 要求这样做,但我认为引入仅适用于 All(x=&gt;x.Viewed) 的扩展方法 AllViewed() 并没有真正提供好处,因为后者显示了意图很好,而且不会再长了。
  • @ckuri 是的,可能是 OP 对 All() 不确定并且已经攻击了 Any。这就是为什么我认为我会在答案中提到 All 。但是就像你说的,All(x=>x.Viewed) 可以很好地完成这项工作,并且在这种特定情况下可能不需要扩展方法。
【解决方案2】:

您可以在静态类中创建扩展方法:

public static class PhraseExtensions
{
    public static bool AllViewed(this List<Phrase> phrases)
    {
        return !phrases.Any(p => !p.Viewed);
        // phrases.All(p => p.Viewed); would be better suited.
    }
}

在此处查看有关扩展的文档:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 2011-11-21
    • 2021-12-25
    • 2012-10-18
    • 2010-09-19
    相关资源
    最近更新 更多