0

我想知道是否可以使用扩展功能实现 Do Loop。

这是我的非工作代码:

  <System.Runtime.CompilerServices.Extension()> _
  Public Sub DoUntil(condition As Func(Of Boolean), action As Action)
    Do Until condition
      action()
    Loop
  End Sub

所以它可以被称为:

   DoUntil(Function() Finished = True, Sub()
 x = x + 1
If IsPrime(x) Then
  Finished = True
)

但我收到错误:“System.Func(Of Boolean)”类型的值无法转换为“Boolean”

谢谢。

4

3 回答 3

1
    var myCollection = new List<string> {"Jeremy 1", "Jeremy 2", "Christy 1", "Tyler 1", ""};
    //using a while loop
    var counter = 0;
    var index = 0;
    var testString = myCollection[index];
    while (myCollection[index] != "")
    {
        counter++;
        index++;
    }
    Console.WriteLine("The count was: " + counter);

    //using linq
    Console.WriteLine("The count was: " + myCollection.Count(i => i != ""));

实际上,第一个例子(尽管它可能很糟糕)是有缺陷的。一旦遇到错误条件,它将停止计数。linq 表达式将打印所有非空元素的计数。

现在,如果您希望它在遇到错误情况时停止计数,那么您正在谈论哨兵值。在这种情况下,循环可能是最简单的解决方案。通常,我只在使用与在数据库中相同的方式处理集合时使用 linq。当我想对“查询”结果执行即时操作时,我只通过使用 lambda 表达式来扩展它们(不正确地使用 imo 这个词)。

于 2012-07-24T17:11:37.107 回答
1

如果您只需要知道满足您条件的寄存器数量,您可以使用类似的东西(我从VB.Net 的 101 个 LINQ 示例中获取了这个示例)

Public Sub Linq74()
Dim numbers() = {5, 4, 1, 3, 9, 8, 6, 7, 2, 0}

Dim oddNumbers = numbers.Count(Function(n) n Mod 2 = 1)

Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers)
End Sub
于 2012-07-24T16:30:42.360 回答
1

假设你已经有了这个(C#,对不起,我对 VB 不是很精通):

//Table name we're looking for
var LookingFor = "Foo";
//Tablenamess returned by some function (in this case some array)
var Foos = new[] { "Bar", "Foobar", "Foo_w00t", "Foo1", "foo7", "SomeFoo", "Foo_3", "Foo4", "F00", "Foo" };

获得计数很容易:

//Look for "XXX[0-9]+" where XXX is the (case insensitive for demonstration purposes) tablename
Regex r = new Regex(string.Format("^{0}[0-9]*$", Regex.Escape(LookingFor)), RegexOptions.IgnoreCase);
var count = Foos.Count(x => r.IsMatch(x));

这将返回( 4Foo1foo7) 。Foo14Foo

于 2012-07-24T16:43:44.880 回答