0

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 Expressionsメソッドは0を返します。ただし、String.Format()(myStrings.Add(stringToFind))を使用せずに特別な値がコレクションに追加されると、式も正しい結果を返します。 。

String.Format()が文字列のエンコーディングを変更するために行うこと、または文字列値の定数式の作成方法に影響を与える何かがありますか?この制限を回避するLINQ式を使用して2つの値を比較する別の方法はありますか?

4

1 に答える 1

1

VB.NETの等式演算子は、参照の比較を行いません。大まかに言えば、object.Equals(とは対照的にobject.ReferenceEquals)メソッドを使用します。式ツリーは、オブジェクト参照の同等性を使用します。

使用string.Formatしても特別なことは何もありません。(「特別な」文字列はありません)。

于 2012-07-12T16:21:08.490 に答える