.net 使用LINQ表达式和String.Format进行字符串比较

.net 使用LINQ表达式和String.Format进行字符串比较,.net,string,linq,string-comparison,linq-expressions,.net,String,Linq,String Comparison,Linq Expressions,我正在使用LINQ表达式动态搜索集合中的值,我遇到了一个奇怪的问题,这似乎是由于搜索由string.Format()操作产生的字符串引起的 这是我试图做的一个简化版本,因为实际上我并不知道我在搜索什么类型的值,我必须将所有东西都视为一个对象 Dim stringToFind As String = "Some Special Value" ' Create a collection of 10 strings, one of which being the string to find ' D

我正在使用LINQ表达式动态搜索集合中的值,我遇到了一个奇怪的问题,这似乎是由于搜索由
string.Format()
操作产生的字符串引起的

这是我试图做的一个简化版本,因为实际上我并不知道我在搜索什么类型的值,我必须将所有东西都视为一个
对象

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()
Dim stringToFind As String=“某些特殊值”
'创建10个字符串的集合,其中一个是要查找的字符串'
将mystring变暗为新列表(对象)
对于i,整数=0到9
如果(i=3),则
添加(String.Format(stringToFind))
其他的
Add(“无聊的普通旧值”)
如果结束
下一个
'为创建谓词'
Dim left=表达式.参数(GetType(对象),“x”)
Dim right=表达式常数(stringToFind)
尺寸相等=表达式相等(左、右)
Dim谓词=Expression.Lambda(Of Func(Of Object,Boolean))(eq,left).Compile()
“比较结果”
Dim standardResults=myString.Where(函数(x)x=stringToFind)
Dim expressionResults=myStrings.Where(谓词)
'预期输出:'
‘标准方法:1’
“LINQ表达式:1”
Console.WriteLine(String.Format(“标准方法:{0}”,standardResults.Count()))
WriteLine(String.Format(“LINQ表达式:{0}”,expressionResults.Count()))
Console.ReadLine()
这里发生的是,标准方法正确地返回1个结果,而LINQ表达式方法返回0。但是,如果在不使用String.Format()(
myStrings.Add(stringToFind)
)的情况下将特殊值添加到集合中,则表达式也会返回正确的结果


String.Format()是否会更改字符串的编码,或者是否会影响为字符串值创建常量表达式的方式?是否有其他方法可以使用LINQ表达式比较两个值,从而绕过此限制?

VB.NET相等运算符不进行引用比较。粗略地说,它使用
object.Equals
方法(与
object.ReferenceEquals
相反)。表达式树使用对象引用相等


使用
string.Format
没有任何特殊功能。(没有“特殊”字符串)。

每个字符串都是相同的。它不会神奇地被String.Format()改变。也许不会,但String.Format(stringToFind)和stringToFind之间显然有一些区别,否则两种情况会产生相同的结果。你是说String.Format(stringToFind)生成了一个新的字符串实例,这样ExpressionEquals的计算结果就会为false吗?@MikeC,没错。这个特殊字符串引用的新实例比较为false。谢谢,我能够使用表达式的重载。调用指定使用Object.Equals方法而不是Object.ReferenceEquals-Expression.Equal(左,右,false,GetType(Object)。GetMethod(“Equals”,{GetType(Object),GetType(Object)}),这就成功了!