1

DataView.RowFilter を使用して DataView をフィルター処理しています。完全な double 値ではなく、丸められた double 値を比較したいと思います。たとえば、[値] 列の値は精度の高い double ですが、比較対象の値は小数点以下 2 桁のみです。

dataView.RowFilter = "Value IN (1.76, 1.92, 2.44)"  

動作しません。私は次のようなことをしたいと思います:

dataView.RowFilter = "Round(Value, 2) IN (1.76, 1.92, 2.44)"  

しかし、これは機能しません (Round() は認識されません)

これは RowFilter でも可能ですか? そうでない場合、これを達成する方法についてのアイデアはありますか?

4

2 に答える 2

2

これは、数学でトリッキーになることにより、フィルター文字列で直接解決できます。

2 dp に丸められた数値は、差が 0 から 0.01 以内になるという事実を使用して、丸められていない数値と比較できます。

つまり、1.23は に近くなり1.23456、 に近くなり1.229876ます。したがって、次のようになります。

1.23 - 1.23456 < 0.01 AND
1.23 - 1.23456 > -0.01

1.23 - 1.229876 < 0.01 AND
1.23 - 1.229876 > -0.01

したがって、フィルター文字列は次のようになります。

fieldName - value < 0.01 AND fieldName - value > -0.01
于 2012-11-02T05:29:30.797 に答える
1

ねえ、私もこれに興味がありますが、(少なくとも現在の ASP Net 機能のセットでは) 不可能であることがわかったと思います。私が見つけた最も有用な RowFilter リソースはここにあります: http://www.csharp-examples.net/dataview-rowfilter/

そのサイト内で最も役立つ情報は、SUM、COUNT、MIN、MAX、AVG (平均)、STDEV (統計標準偏差)、および VAR を実行できることです。CONVERT、LEN、ISNULL、IIF、TRIM、SUBSTRING と同様です。

フィルターに関する私の問題は、基になる値が 1.23456 で、最初の sig 桁のみを表示していて (したがって 1.23 と表示される)、値 = 1.23 の場所をフィルター処理しようとすると結果が得られない場合です。理想的には、ROUND 機能を使用すると、行の値を関心のある sig-dig に丸めることができますが、これを達成する適切な方法を見つけることもできませんでした。

幸運を祈ります。何か見つけたらお知らせします。

編集:実際、これを書いた後、これを行うためのよりジャンキーな方法について考えました。両方の値に 10^x を掛けてから整数に変換する方法は、うまく機能しますが、それほどひどいものではありません。以下のサンプルコード:

int mult = Convert.ToInt32(Math.Pow(10.0, _defaultDecimalSignificantDigits)); //in your example 2
            dv.RowFilter = String.Format("CONVERT({0}*{3},System.Int32){1}CONVERT({2}*{3},System.Int32)", name, expression, value, mult); //where "name" is your column name, "expression" is =, <>, etc, and "value" is the entered row filter value

値は表示では乗算されず、フィルタ ロジックでのみ乗算されます。したがって、スコアが 14.998 の場合、フィルターに 1000 を掛けます (フィルターと値に 14,998 の値を与えます)。

これには、丸めようとしている小数点以下のスペースの数に基づいて明らかに制限がありますが、2 で丸める例では、両方を 100 倍するだけで済みます。また、Int32 境界をオーバーフローする可能性があり、Int64 が必要になる場合があります。

于 2010-02-15T22:55:43.030 に答える