【问题标题】:ForEach anonymous function, can't returnForEach 匿名函数,无法返回
【发布时间】:2012-05-15 06:29:36
【问题描述】:

我无法从 ForEach 返回,这是我的代码:

cards.ForEach(delegate(Card c){
    if (c.GetFaceValue().ToString() == card) {
        return "Your Card has been located";
    }

错误:

无法将匿名方法转换为委托类型“... .Card>”,因为块中的某些返回类型不能隐式转换为委托返回类型

以下内容也不起作用,因为CheckCard 只能返回 void:

 cards.ForEach(CheckCard);

 public string CheckCard(Card c) {
        if (c.GetFaceValue().ToString() == card) { // card = global 
            return "Your Card has been located";
        }
    }

错误:

'string SharedGamesClasses.Hand.CheckCard(SharedGamesClasses.Card)' 返回类型错误

【问题讨论】:

  • 要对某事进行 foreach,您希望委托返回实现 IEnumerable 的内容。想想 List.FindAll 之类的东西。

标签: c# .net linq


【解决方案1】:

查看提供的逻辑,我假设您将终止迭代作为 sson,因为找到了 Card。为此,只需使用一个简单的foreach,例如:

string SomeFunc(IEnumerable<Card> cards) 
{
  foreach(Card in cards)
  {
     if(c.GetFaceValue().ToString() == card) {
        return "Your Card has been located";
  }
}

【讨论】:

    【解决方案2】:

    您当前正尝试从匿名函数返回消息,而不是您的调用代码;这不起作用,因为匿名函数是 Action&lt;T&gt;,它不能返回任何东西。

    您是否只想查看cards 中的任何元素是否与card 匹配,如果匹配则返回消息?

    使用.Any() 代替.ForEach()

    if (cards.Any(c => c.GetFaceValue().ToString() == card))
    {
        return "Your Card has been located";
    }
    

    【讨论】:

    • 我认为他需要所有而不是任何
    • 谢谢!我是 c# 的新手,你能告诉我 'c => c.GetFaceValue().ToString() == card' 是什么意思吗?或者那个概念叫什么,所以我可以查一下。
    • 哦,这是lambda expression,是匿名代表的一种快捷语法。和delegate(Card c) { return c.GetFaceValue().ToString() == card; }一样。
    【解决方案3】:

    ForEach 有一个 void - 你不能返回一个值。

    Action 是

    的委托快捷方式
    public delegate void Action<in T>(
        T obj
    )
    

    注意这里的空白。

    http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx

    public void ForEach(
        Action<T> action
    )
    

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多