2017-08-18 9 views
0

と<文字列、文字列は>>この充填一覧は<タプルLINQ

{'123', 
'234', 
'345', 
'123c', 
'456', 
'234c'} 

のような文字列のリストがあり、タスクはすべてのタプルをlist<Tuple<string><string>> を作成し、埋めるためになるように、最初の値がいくつか " x 'と第2の値' xc ' たとえば、タプル< 123,123c>、' c '文字で終わるペアがない場合は、タプルTuple < 345、null>のように、2番目の値nullに入れます。 linqでそれを行う方法はありますか?彼らの単語がcaracter「C」で終わる場合に基づいてリスト要素による

var result = list.GroupBy(word => !word.EndsWith('c')) 
       .Select(gr => Tuple.Create(gr.Key, gr.FirstOrDefault(i=>i.Contains(gr.Key)))); 

基本的に、あなたがグループ:

+0

いつも3桁ありますか? –

+0

いいえ、10桁まで可能です – e0x3

答えて

1

あなたはこのような何かを試みることができます。だから、あなたは一連のキーを持っています。これは、文字 'c'で終わらない単語と、これらのキーのそれぞれに関連するシーケンスで、 'c'で終わる単語です。次に、最初の要素をgropuのキーとし、2番目の要素を 'c'で終わる対応する値とするタプルのシーケンスで結果を投影します。存在しない場合はnullを返します。ここで

+0

これは機能しません。 'GroupBy'は二つのグループを作ります:一つは' c'で終わらない文字列、もう一つは文字列です。 'Select'は' bool'を含む文字列、 'true'か' false'を探します。 –

1

後の二つのグループに分割さタプルを生成する非常にシンプルなソリューションです:これらの手順にコードを分割

var firsts = strings.Where(s => !s.EndsWith("c")); 
var seconds = strings.Where(s => s.EndsWith("c")); 

var result = firsts.Select(f => 
    new Tuple<string, string>(f, seconds.FirstOrDefault(s => s.Replace("c", "") == f))); 

は読んで理解することが容易になります。

1

あなたが取り除か「C」を、末尾のグループ、それらの値によって、すべての文字列を、その後、出力カウントはこれが/ネット4.7 C#の7.xのある1

よりも大きいかどうかに基づいてタプルをすることができます新しいタプル構文を使用するソリューション:determにg.Count() > 1を使用していること

var result = strings 
    .GroupBy(x => x.TrimEnd('c')) 
    .Select((g, v) => Tuple.Create(g.Key, g.Count() > 1 ? g.Key+'c': null)); 

注:

var result = strings 
    .GroupBy(x => x.TrimEnd('c')) 
    .Select((g, v) => (g.Key, g.Count() > 1 ? g.Key+'c': null)); 

は、ここでのC#と.NETの古いバージョンを使用して、同じアプローチですシーケンスに複数の要素が含まれている場合は、通常、g.Skip(1).Any()を使用する場合ほど効率的ではありませんが、この特定のアプリケーションでは、2つ以上の項目が存在しないため効率的ですコレクション。すべての入力文字列の最後に、オプションのcと数字の文字列がある場合

0

、あなたはこれを試みることができる:

var result = list.GroupBy(x => x.TrimEnd('c')) 
       .Select(g => Tuple.Create(g.Key, g.FirstOrDefault(v => v.EndsWith("c")))) 

この意志のグループにそれらを数字の文字列で、任意のcで除外されました最初の項目がその桁の文字列であり、2番目の項目がその文字列である場合は、cがリストに追加されている場合は追加されていない場合はnullのタプルを作成します。