C# 我们可以在LINQ查询中使用重载Where运算符吗?

C# 我们可以在LINQ查询中使用重载Where运算符吗?,c#,linq,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)

此示例演示了一个索引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); 
    } 
}

如何从上面的查询中获取索引值?

否,重载
,其中
运算符在查询语法中不可用。以下是引自:

在查询表达式语法中,where(visualc#)或where(visualc Basic)子句转换为对
Where(IEnumerable,Func)

您可以手动引入索引:

int index = 0;
var query = from u in digits 
            where u.Length > index++ 
            select u;
但请记住,您还应该在每次查询调用之前手动重置索引。无论如何-如果您需要索引,那么fluent API是您的最佳选择:

var query = digits.Where((u, i) => u.Length > i); 
我看不出有什么理由不使用它。

试试这个:

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;
string[]位={“零”、“一”、“二”、“三”、“四”、“五”、“六”、“七”、“八”、“九”};
var shortDigits=来自数字对。选择((数字,索引)=>新建{数字,索引})
其中pair.digit.Length
可能的重复感谢的可能重复…还有其他选项吗?@user1849388我添加了指向msdn的链接,该链接指向如何将查询语法转换为Where运算符。问题是您应该在查询语法中将
Func
传递给where子句。不能在此处添加其他参数。我仍然不明白为什么您不想使用
Where((u,I)=>u.Length>I)
非常感谢。这正是我要找的。顺便问一下,他选择的和在哪里的有什么区别?我认为这两个操作符所做的工作是相同的?当您需要迭代枚举的所有元素并为这些元素返回某些内容(在我的示例中是一对值)时,通常使用Select。Where通常用于将枚举限制为满足给定条件的元素列表。我的回答对你考虑接受和投票是有用的。
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;