2012-11-23 3 views
6

"41,42x、43"のような文字列リストに変換するには、良いlinq式を使用する方が良いでしょう有効なlongのリスト。以下のコードは動作しますが、ちょうど醜い感じです。C#で有効なリスト<long>に文字列リストを変換するためのきれいな方法をお探しですか?

string addressBookEntryIds = "41,42x,43"; 
var ids = addressBookEntryIds.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries); 
var addressBookEntryIdList =new List<long>(); 
foreach (var rec in ids) 
{ 
    long val; 
    if (Int64.TryParse(rec, out val)) 
    { 
     addressBookEntryIdList.Add(val); 
    } 
} 

答えて

4
string addressBookEntryIds = "41,42x,43"; 

Func<string, long?> safeParse = (s) => { 
      long val; 
      if (Int64.TryParse(s, out val)) 
      { 
       return val; 
      } 
      return null;  
}; 


var longs = (from s in addressBookEntryIds.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) 
      let cand = safeParse(s) 
      where cand.HasValue 
      select cand.Value).ToList(); 
+0

私はこれをLinqpadでテストしました。私はコードで安全でない入力と似たようなことをしますが、私のソースデータは実際にはSQLから来ています。私はこれが何らかの形できわめてきれいだとは言わないでしょう - 私はあなたの元のコードは大丈夫だと思います。それは簡潔で、明確で、ポイントまでです。 – SAJ14SAJ

3

使用正規表現

var list = Regex.Matches(@"41,42x,43", @"\d+").Cast<Match>().Select(x => Convert.ToInt64(x.Value)).ToList(); 
+0

。 42x43は2つのエントリを作成し、参照実装に基づいてゼロではありません。 – SAJ14SAJ

0

かなり冗長なコードのジャスト導出、(TryParseを使用し、再度解析)、私はそれがうまくいくと思う:

addressBookEntryIds.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries) 
        .Where(id => 
        { 
         long val; 
         return Int64.TryParse(id, out val); 
        }) 
        .Select(id => Int64.Parse(id)); 
+0

皆さんに感謝します。それはすべて役に立ちます。 –

1

さて、ここですLINQバージョンですが、それほど醜いことはありません!

string addressBookEntryIds = "41,42x,43"; 
var ids = addressBookEntryIds.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries); 

Int64 converted; // Working value used within the select 
IEnumerable<Int64> values = ids.Select(x => new 
{ 
    Success = Int64.TryParse(x, out converted), 
    Value = converted 
}).Where(x => x.Success) 
    .Select(x => x.Value); 

このソリューションとアンダーソンの違いはTryParseが唯一のエントリごとに一度と呼ばれていることです。

1

はここで別のLINQのバージョンです:あなたは、クエリ式を希望する場合

String addressBookEntryIds = "41,42x,43"; 
Int64 val = 0; 

addressBookEntryIds 
    .Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) 
    .Where(id => Int64.TryParse(id, out val)) 
    .Select(id => val) 
    .ToList() 

、あなたが使用することができます。

またはフォーム上のエントリをによっては動作しない場合があり
from id in addressBookEntryIds.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) 
where Int64.TryParse(id, out val) 
select val 
関連する問題