4

私は実際にこの質問に答えようとしていますが、それは非常に複雑で、すぐに良い応答が得られない可能性があるため、自分で実装を試してみます。基本的な問題は、私がフォローしていたC#の例がVBに直接変換されないことのようです。

ラムダで文字列の比較を調べるときBinaryExpression、VBはメソッド名が。であると報告Expression.Method.DeclaringTypeします。これは明らかにVB固有です。Microsoft.VisualBasic.CompilerServices.OperatorsCompareString

x.Content_Type <> ""式は、ToStringを比較して呼び出すだけで、戻り値が返されます。{(CompareString(x.Content_Type, "", False) != 0)}これはかなり論理的なようです(CompareStringのドキュメントはこちら)。

誰かが私にVBとC#が文字列の比較を異なる方法で処理する方法(またはさらに良い理由)を説明できますか?

その答えが得られれば、もう一つの問題の解決策が見つかるはずだと思います。

編集: 明確にするために、私は次のWhere呼び出しを調べているカスタムLINQプロバイダーを実装しています:

Query.Where(function(x) x.Content_Type <> "")

または同等のC#...

query.Where(x=>x.Content_Type!="");

私の知る限り、2つは機能的に同一である必要があります

4

2 に答える 2

10

VB.NET は、Option Compare以前のバージョンの Visual Basic からステートメントを継承しました。これを機能させるために、VB.NET のすべての文字列比較式はヘルパー関数に変換され、ステートメントが記述された特定のソース コード ファイルで選択された Option Compare 値が何であったかを調べることができます。

Operators.CompareString(string, string, bool) メソッドはそのヘルパー関数です。最後の引数の名前は「TextCompare」です。VB.NET コンパイラは、Option Compare Text が有効な場合は自動的に True を渡し、Option Compare Binary が有効な場合は False を渡します。

C# にはそのようなものはありません。

于 2012-08-30T13:28:34.663 に答える
5

逆コンパイルCompareStringすると

public static int CompareString(string Left, string Right, bool TextCompare)
{
  if (Left == Right)
    return 0;
  if (Left == null)
    return Right.Length == 0 ? 0 : -1;
  else if (Right == null)
  {
    return Left.Length == 0 ? 0 : 1;
  }
  else
  {
    int num = !TextCompare 
       ? string.CompareOrdinal(Left, Right) 
       : Utils.GetCultureInfo().CompareInfo
              .Compare(Left, Right, CompareOptions.IgnoreCase 
                                  | CompareOptions.IgnoreKanaType 
                                  | CompareOptions.IgnoreWidth);
    if (num == 0)
      return 0;
    return num > 0 ? 1 : -1;
  }
}

そこから、カスタム ロジックnull(「NothingVisual Basic では」、控えめに言っても) の処理と、さらに重要なこととして、有効な設定TextCompareから値を取得するモード切り替えパラメーターがあることがわかります。Option Compare

おそらく、比較演算子ではなくonのメソッドを明示的に使用すると、役立つでしょう。string

「理由」に関しては、まあ、VB (クラシック) は常に、C++ / Win32 の「私が言ったことを正確に実行し、それ以上でもそれ以下でもない」哲学とは対照的に、文化的により「賢明なことを行う」言語でした。世界。VB.NET と C# は近いですが、このような違いはまだ残っています。

于 2012-08-30T13:32:16.577 に答える