2011-07-11 14 views
2

は、私は次のリストがあるとします。リスト内の非数値項目を検索するLinqクエリ?

 var strings = new List<string>(); 
     strings.Add("1"); 
     strings.Add("12.456"); 
     strings.Add("Foobar"); 
     strings.Add("0.56"); 
     strings.Add("zero"); 

は、リストから私に数値項目のみ、すなわち第一、第二、および第四のアイテムを返します。私は、LINQの中に書くことができ、クエリのいくつかの並べ替えはありますか?

-R。

+2

ステップとあなたがstringly入力されたデータを扱っている理由を自問してみてください単一のリスト?私は単に推測していますが、おそらくここでの答えは問題を再定義することです。 –

+0

@Anthony:データが私のコントロールを超えた配列の配列として私に戻ってきています。私はちょうどToList()を使って数字のデータだけを取得するクエリを作成します。タイプを指定します。 – Randy

+0

@Randyでは、配列に 'ToList()'を呼び出す必要はありません。 – svick

答えて

2
strings.Where(s => { double ignored; return double.TryParse(s, out ignored); }) 

これは、文字列としてdouble秒として解析可能であるすべての文字列を返します。あなたが(もっと理にかなって)数字としてそれらをしたい場合は、拡張メソッドを書くことができます:

public static IEnumerable<double> GetDoubles(this IEnumerable<string> strings) 
{ 
    foreach (var s in strings) 
    { 
     double result; 
     if (double.TryParse(s, out result)) 
      yield return result; 
    } 
} 

double.TryParse()があなたの現在のカルチャを使用していますので、それは別のコンピュータ上の異なる結果を与えることを忘れないでください。あなたがそれを望まないなら、double.TryParse(s, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result)を使用してください。

+0

D'oh。私はそれが何か簡単だと分かっていました。脳死した - ありがとう。 – Randy

3

これを試してみてください:

double dummy = 0; 
    var strings = new List<string>(); 
    strings.Add("1"); 
    strings.Add("12.456"); 
    strings.Add("Foobar"); 
    strings.Add("0.56"); 
    strings.Add("zero"); 
    var numbers = strings.Where(a=>double.TryParse(a, out dummy)); 
2

あなたがそうのように、各文字列を調べるために、単純な述語を使用することができますバック

var strings = new List<string>(); 
     strings.Add("1"); 
     strings.Add("12.456"); 
     strings.Add("Foobar"); 
     strings.Add("0.56"); 
     strings.Add("zero"); 

var nums = strings.Where(s => s.ToCharArray().All(n => Char.IsNumber(n) || n == '.')); 
+0

負の数値はどうですか?指数表記はどうですか(それを処理する必要があるかどうかは不明です)。 – svick

+0

@svick OPは、これらの制約のいずれも指定していませんでした。これは、質問で提供されたサンプルデータに基づく前提を使用した、「迅速で汚れた」検証です。個人的には、「TryParse」は簡単なサンプルデータを提供するだけで、単純な検証のために多くの不必要なオーバーヘッドがあると思います。この回答は、「ミッションクリティカルな」検証のためのものではなく、より複雑なソリューション(彼のニーズに基づいて決定するためにOPに残されています)に代わるものです。 –

+0

これは、適切な解決法よりもはるかに短い場合、または同様の場合に「迅速かつ汚れた」という点を見ることができますが、ここではそのような場合はわかりません。パフォーマンスに関しては、それがここで問題になるのは本当に疑わしいので、私はその決定に基づいていません。 – svick

関連する問題