0

次のLINQクエリを取得しました:-

(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50)

戻ります:-

114                                
115                                
115 A                              
116                                
116 A                              
118                                
119                                
122                                
124                                
128                                
131                                
132                                
133                                
95                                 
96                                 
97                                 
98                                 
99   

このリストを数値でソートできるようにする必要があります。これは次のように行うことができます:-

(from a in MyData
where a.Field1.Replace(" ","").Contains("ABCDEFG")
select a.Field2).Take(50).OrderBy(x => Convert.ToInt32(x))

問題はこれが返すことです:-

Conversion failed when converting the nvarchar value '111 A ' to data type int.

明らかに を'111 A '整数に変換できないためです。

並べ替えのためだけに数字以外の文字をすべて取り除く方法はありますか?

4

2 に答える 2

3

試す:

MyData.Where(d => Field1.Replace(" ","").Contains("ABCDEFG"))
    .AsEnumerable()
    .OrderBy(d => Convert.ToInt32(Regex.Split(d.Field2, @"\D+")[0]))
    .Take(50)
    .Select(d => d.Field2);

希望する結果に応じて、OrderBy()とTake()を入れ替えることができます。ただし、BobValeが以下に記しているように:

Take()が最初の場合は、AsEnumerable()の前にある必要があります

ソースからすべてのレコードをロードしないようにします。

于 2013-03-20T14:41:58.687 に答える
0

そこにある最も美しいコードではありませんが、ソートラムダでは、数字のみで構成される新しい文字列を作成し、それをソート値の整数に変換できます。

.OrderBy(x => 
    Convert.ToInt32(new string(x.Where(c => char.IsDigit(c))
                                .ToArray()
                              )
                   )
        );
于 2013-03-20T14:42:15.697 に答える