2015-10-21 3 views
6

をスローIコレクションをグループ化する次のシナリオを持っている:私はC#IEnumerable.Countは()IndexOutOfRangeException

if(result.Count()>0) 

を確認した場合、データ変数の型ObservableCollection<Data>

である

var result = data.GroupBy(x => x.Name.Split(new char[] { '-' })[1].Trim()); 

IndexOutOfRangeExceptionをスローする

もちろん、これは文字列分割操作で例外がスローされるために発生します。

質問があります:グループ化の結果がnullではなく、例外を回避しているかどうかを確認する方法はありますか?

+3

あなたは '-'で分割し、この配列をインデックス1(2番目の項目)にアクセスしています。明らかに、 '-'がなかったので、2番目の項目はありません。だから、それは 'null'とは何の関係もありません。 –

+0

はい私は知っている、グループ内の配列の長さを確認する方法はステートメントですか? –

+0

resut.Any()はこのトリックを行うことができますか? –

答えて

10

まず、Enumerable.Countはちょうど(GroupByは遅延実行を使用して、発言セクションを見て)繰延実行LINQクエリを実行します。だからCountはここに責任がありません。

-で分割し、2番目の項目であるインデックス1でこの配列にアクセスしています。明らかに、-がなかったので、2番目の項目はありません。したがって、nullとは関係ありません。

多分唯一の第二のトークンがある場合、それらを取るのに十分である:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.Where(x => x.Split.Length >= 2) 
.GroupBy(x => x.Split[1].Trim()); 

または第二の第二がある場合には、そうでない場合は最初に:

var result = data 
.Select(x => new{ Data = x, Split = x.Name.Split(new char[] { '-' }) }) 
.GroupBy(x => x.Split.Length >= 2 ? x.Split[1].Trim() : x.Split[0].Trim()); 
+0

...または空白のグループ名を持つグループ(何かのようなもの) var result = data.GroupBy(x =>(x.Name!= x&lt; Name&gt; –

+0

優れた答えTim、ありがとう –

2

あなたが行うことができます次

var result = data.GroupBy(x => x.Name.Contains('-') ? x.Name.Split('-')[1].Trim() : ""); 

あなたがを好きではない場合:?

var result = data.GroupBy(x => 
{ 
    string name = x.Name; 
    if (name.Contains('-')) return name.Split('-')[1].Trim(); 
    return ""; 
}); 

注:それはあまりコンパクトで、使用オペレータまたはたい私が代わりにSplit(new char[] { '-' })

Split('-')を使用これはおそらくティムSchmelterのソリューションよりも直感的ですが、あなたが望むものを使用します。

関連する問題