我正在使用 LINQ 表达式动态搜索集合中的值,我遇到了一个奇怪的问题,这似乎是由搜索作为String.Format()
操作结果的字符串引起的。
这是我正在尝试做的一个简化版本,因为在实践中我实际上并不知道我正在寻找什么类型的值,所以我必须将所有内容都视为Object
.
Dim stringToFind As String = "Some Special Value"
' Create a collection of 10 strings, one of which being the string to find '
Dim myStrings As New List(Of Object)
For i As Integer = 0 To 9
If (i = 3) Then
myStrings.Add(String.Format(stringToFind))
Else
myStrings.Add("Boring Plain Old Value")
End If
Next
' Create the predicate for <Function(x) x = stringToFind> '
Dim left = Expression.Parameter(GetType(Object), "x")
Dim right = Expression.Constant(stringToFind)
Dim eq = Expression.Equal(left, right)
Dim predicate = Expression.Lambda(Of Func(Of Object, Boolean))(eq, left).Compile()
' Compare the results '
Dim standardResults = myStrings.Where(Function(x) x = stringToFind)
Dim expressionResults = myStrings.Where(predicate)
' Expected Output:'
' Standard Method: 1 '
' LINQ Expressions: 1 '
Console.WriteLine(String.Format("Standard Method: {0}", standardResults.Count()))
Console.WriteLine(String.Format("LINQ Expressions: {0}", expressionResults.Count()))
Console.ReadLine()
这里发生的是标准方法正确返回 1,而 LINQ 表达式方法返回 0。但是,如果不使用 String.Format() ( myStrings.Add(stringToFind)
) 将特殊值添加到集合中,则表达式也会返回正确结果.
String.Format() 是否会更改字符串的编码,或者会影响如何为字符串值创建常量表达式?有没有另一种方法可以使用 LINQ 表达式比较两个值来绕过这个限制?