我们可以在LINQ Query中使用重载的Where运算符吗?

时间:2012-12-20 09:56:39

标签: c# linq

此示例演示索引的Where子句,该子句返回名称小于其值的数字。 源代码

public void Linq5() 
{ 
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

    var shortDigits = digits.Where((digit, index) => digit.Length < index); 

    Console.WriteLine("Short digits:"); 
    foreach (var d in shortDigits) 
    { 
        Console.WriteLine("The word {0} is shorter than its value.", d); 
    } 
}

现在我的问题是......我们可以用LINQ查询格式写这个:

from u in digits where u.Length>index select u;

这里如何从Query上面获取INDEX值?

2 个答案:

答案 0 :(得分:1)

不,查询语法中没有重载的Where运算符。以下是msdn的引用:

  

在查询表达式语法中, where (Visual C#)或Where(Visual   Basic)子句转换为。的调用   Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

您可以手动引入索引:

int index = 0;
var query = from u in digits 
            where u.Length > index++ 
            select u;

但请记住,您还应在每次查询调用之前手动重置索引。无论如何 - 如果你需要索引,那么流畅的API是你的最佳选择:

var query = digits.Where((u, i) => u.Length > i); 

我认为没有任何理由不使用它。

答案 1 :(得分:0)

试试这个:

string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

var shortDigits = from pair in digits.Select((digit, index) => new { digit, index })
              where pair.digit.Length < pair.index
              select pair.digit;