【问题标题】:Create a list with methods with a return value C#使用具有返回值 C# 的方法创建一个列表
【发布时间】:2022-01-16 17:30:34
【问题描述】:

我做了一个小程序,想分析语料库中德语名词的性别。为此,我创建了一些以字符串作为返回值的方法。例如,我想检查语料库中名词前面是否有定语,看它是否包含“der”、“die”或“das”。深化它返回不同的值。如下:

private string definitearticle()
{ 
    // code, where gender is the string which we return - if we can't determine
    // the gender it returns "Cannot determine"
    return gender;
}

private string indefinitearticle()
{ 
    // code, where gender is the string which we return - if we can't determine
    // the gender it returns "Cannot determine"
    return gender;
}

我想逐个循环每个方法,直到我不再得到“无法确定”作为返回值,如下所示,并带有指向方法的指针列表(如在Storing a list of methods in C# 中):

var methods = new List<(System.Action check, string caption)>()
{
    (definitearticle, "Definite article"),
    (indefinitearticle, "Indefinite article"),
};

foreach (var method in methods)
{
    gender = method.check.Invoke();
    if (gender != "Cannot determine")
    {
        // store the outcome that was returned to a list
        break;
    }
}

问题是我不知道如何将Listmethods 一起使用,后者具有return value(在本例中为string)。有谁能帮帮我吗?

【问题讨论】:

  • 我注意到您有一个姓名列表,并且您想在其中搜索一个或多个字母?对吗?
  • 使用 Func 代替 Action。微软文档:docs.microsoft.com/en-us/dotnet/api/system.func-2?view=net-6.0
  • 我想我会定义一个枚举来表示性别/不能,然后有一个 new List&lt;Func&lt;string, GenderEnum&gt;&gt;() - 我无法弄清楚元组的 caption 成员是做什么的,但感觉如果它在其他地方使用,可以免费恢复它。 func Func&lt;string, Gender&gt; 接受一个字符串参数,我想这就是你要传入检查的内容..
  • (但是,如果您例如循环遍历表示为字符串 [] 的单词列表的语料库,并传递一个 int 索引进行检查,以便您可以查看 N-1'第一个词来查看它是否是 der/die 等,那么您需要制作接受 string[], int 并返回 GenderEnum 的方法,所以它会是 Func&lt;string[], int, GenderEnum&gt; - 无论如何,这就是模式:Func&lt;T1,T2,..TN, TReturn&gt;,至少只是 TReturn
  • 谢谢!我正在逐行分析维基百科数据,所以它是针对那些名称的。 Caption 只是在我写结果时为统计建议找到正确性别的函数的标题。

标签: c# list methods


【解决方案1】:

如果您需要将方法存储为具有返回值的类型,则应使用Func&lt;TResult&gt; 而不是Action。它的工作方式与操作相同,只是您可以额外输入返回类型作为最后一个泛型类型。因此,例如,如果你有一个方法,它有两个参数,类型为 intbool,返回类型为 string,你会说

var myReturnMethod = new Func<int, bool, string>((intVal, boolVal) => intVal.ToString() + boolVal.ToString());

在您的情况下,只需将您的方法变量初始化替换为以下代码:

var methods = new List<(Func<string> check, string caption)>
    {
        (definitearticle, "Definite article"),
        (indefinitearticle, "Indefinite article"),
    };

编辑:

应 OP 的要求,如果您只希望它包含方法的集合,不带标题,那么您将如何初始化方法变量:

        var methods = new List<Func<string>>
        {
            definitearticle,
            indefinitearticle,
        };

更多关于函数的信息可以在the official microsoft docs找到。

【讨论】:

  • 谢谢,这似乎可以解决问题!
  • 没问题!快乐的编码和欢呼!
  • 还有一件事,说我要去掉methods列表中的标题,那我怎么写呢?
  • 我编辑了我的答案以演示您将如何做到这一点。
  • 太棒了!非常感谢:-)
猜你喜欢
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 2022-08-07
  • 2021-06-13
相关资源
最近更新 更多