Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在while循环条件下使用lambda表达式?_C#_Lambda - Fatal编程技术网

C# 如何在while循环条件下使用lambda表达式?

C# 如何在while循环条件下使用lambda表达式?,c#,lambda,C#,Lambda,是否可以在此处使用内联lambda函数来避免调用两次list.next()?如果next()确实从列表中删除了元素,这不仅是方便的,而且是必要的。此列表是IEnumerable对象吗?你可以随时使用 while(list.next() != null && list.next().asInteger() != 6) { ... } YourType foo; while ((foo = list.next()) != null && foo.asInteger

是否可以在此处使用内联lambda函数来避免调用两次
list.next()
?如果
next()
确实从列表中删除了元素,这不仅是方便的,而且是必要的。

此列表是IEnumerable对象吗?你可以随时使用

while(list.next() != null && list.next().asInteger() != 6)
{
 ...
}
YourType foo;
while ((foo = list.next()) != null && foo.asInteger() != 6)
{
}
如果我答错了,请告诉我。

您可以使用for代替while:


可以在while循环中分配变量。这样写比较容易

for (var item = list.next(); item != null && item.asInteger() !=6; item = list.next()) {
  ...
}
或者更好的是

WhateverNextReturns nextListItem;
while ((nextListItem = list.next()) != null) && nextListItem.asInteger() != 6)
// Do some stuff
我认为使用lambda会让事情变得比实际情况更复杂

这是另一个例子,有人在while表达式中分配变量,可以使用内联lambda来实现,但C#不喜欢它:

while(((Func)(n=>n!=null&&n.asInteger()!=6))(list.next())
{
...                
}

如果
列表
不是
IEnumerable
类型,该怎么办
.ForEach
没有为
IEnumerable
实现,是吗?它无论如何都不起作用。您的循环会循环所有符合这些条件的情况,我的示例会在列表元素与标准不匹配时停止。在这种情况下,我会在ForEach之前触发一个TolList()。@Mr.Boy是的,我没有注意到问题陈述的这一部分。对不起,没关系。我的答案被否决了,你得到了你的答案。也许就这样吧。我的回答显然在概念上也是错误的。所以,这无关紧要。
list
是否实现了
IEnumerable
?为什么不简单地提取一个方法?假设您正在使用
list.next()执行某些操作
如果这将它从列表中删除,那么你将无法在循环中访问它,除非你先将它放入一个本地变量中,如果你这样做了,那么就可以很容易地编写一些东西,而不调用
next
两次。它可以工作,但严格来说不是lambda。。。这既是一个学习问题,也是一个“我应该怎么做”问题——我想知道while子句/表达式是否可以是一个lambda,在while语句中声明itself@Mr.Boy它可能是,但它实际上不会完成任何有成效的事情。lambda不过是一个匿名方法;这里不需要额外的方法,不管匿名与否。@Servy是的,但我将如何做到这一点-语法是什么样的-是问题的关键。我认为罗琳的答案就是这样的——这是最好的答案吗(我明白你为什么不想这么做了!)@Mr.Boy这真的没关系。在这种情况下,没有令人信服的理由使用lambda,因此了解如何使用lambda确实没有帮助,因为人们永远不会这样做。您能否通过在lambda中显式键入
n
来避免显式转换为
Func
?ie
(你的类型)n=>n!=空(&n.asInteger()!=6
?@Chris否。lambda仍然需要知道它应该表示为什么委托。@Chris它类似于键入
var func=(char c)=>c!='6';。我想这是因为没有理由让
Func
比任何其他接受
char
并返回
bool
的委托更好@Servy:啊,谢谢。我以前从未真正使用过这样的匿名lambda,所以我不确定。我想它可以告诉返回类型,所以如果你告诉它输入类型,它可能会做正确的事情。:)@Chris可以有任意数量的具有完全相同签名的不同类型的代表。仅仅知道签名是不够的。
WhateverNextReturns nextListItem;
while ((nextListItem = list.next()) != null) && nextListItem.asInteger() != 6)
// Do some stuff
WhateverNextReturns nextListItem;
while(true)
{
  nextListItem = list.next();
  if (nextListItem == null || nextListItem == 6)
    break;
  //Do some stuff
}
while (((Func<YourType, bool>)(n => n != null && n.asInteger() != 6))(list.next()))
{
    ...                
}