12

私はこの問題を抱えています、私は購入のためのテーブルを持っています

Purchases(Date DateTime, Number string)

新しいレコードを作成したいので、Max(Number) が必要です。ここでの問題は、Number が文字列であることです。

Purchases.Select(X=>int.Parse(X.Number)).Max()

ただし、例外がスローされる可能性があります。カスタムToInt()拡張機能を作成したので、使用すると

Purchases.Select(X=>X.Number.ToInt()).Max()

私のToInt()は有名なToString()と同じlinqクエリでは使用できないという例外がスローされます

私の質問は次のとおりです。linqクエリで文字列をintにキャストし、同時に例外を処理する方法や、カスタム関数をlinqクエリに統合する方法はありますか!!

これが私の拡張機能です

    public static int ToInt(this string s)
    {
        try
        {
            return int.Parse(s);
        }
        catch
        {
        }
        return 0;
    }
4

2 に答える 2

17

最初の方法:

var numbers = Purchases.Select(x => x.Number).ToList();

int temp;
int max = numbers.Select(n => int.TryParse(n, out temp) ? temp : 0).Max();

Console.WriteLine("Max: {0}", max);

2 番目の方法:

int temp2;
int max2 = Purchases.Select(x => x.Number).ToList().Select(n => int.TryParse(n, out temp2) ? temp2 : 0).Max();

Console.WriteLine("Max 2: {0}", max2);

鍵は、.ToList()この 2 つの方法にあります。データベースからすべてのstringデータを取得するためint.TryParse、結果を呼び出すと、データベース クエリは既に実行されているため、純粋な CLR コードを使用int.TryParseしており、SQL クエリに変換しようとはしていません。サンドボックス プロジェクトの 1 つで EF コンテキストを作成し、これが機能することを確認しました。

于 2012-10-01T16:52:36.367 に答える
2

キャストに失敗した場合、アプリケーションに何か問題が発生したことを意味するため、例外が必要ない理由がわかりません(または、少なくとも、私はそれを理解しています)。また、数値であるべきものを文字列としてデータベースに保存する理由もわかりません。通常、後でこのような問題に対処する必要がないように、数値として保持します。誰かが間違った値を挿入しようとすると、挿入に失敗します。

しかし、この行を機能させたいint.TryParse場合は、値が正常にキャストされた場合に true を返し、値をクエリから外れる「out」メンバーに入れる必要があります。このような:

int tmp;
Purchases.Select(X=>int.TryParse(X.Number, out tmp) ? tmp : 0).Max()

「0」の代わりに、ロジックを台無しにしないデフォルト値を入力します。

于 2012-10-01T16:35:16.280 に答える