2011-06-21 26 views
-1

私はLINQを知っていますが、私の知識はほとんどの場合、orderbyとすべての最も一般的な機能を選択するだけです。今私は本当に難しいと思う何かをする必要があります。 LINQだけではできないかもしれません。私が持っているものは人々のリストです。それはクエリの東ですが、私はそのリストからテキスト文字列を作成する必要があります。テキスト文字列には、それぞれの人の名前が続く文字が必要です。複雑なLINQクエリ

IList<person> Person 

私は、PersonリストをチェックするLINQ文を持つことができる必要があります。複数回表示される名前を探すには が必要です。これまでのところ、私は以下のことを持っています。表示されていること言い換えれば

Person[0] name="John" then var abc = "a) John." 

Person[1] name="John" & 
Person[3] name="John" then var abc = "b) & d) John." 

Person[1] name="John" & 
Person[2] name="John" & 
Person[3] name="John" then var abc = "b),c) & d) John." 

、名前を取得し、それらの前の文字を入れて:それは大丈夫動作しますが、必要なすべてを与えるものではありませんように、私は必要なもの

Person[0] name="Fred" & 
Person[1] name="Pete" & 
Person[2] name="Tony" the var abc = "a) Fred. b) Pete. c) Tony 

var a = ""; 
foreach (var person in _persons 
      .Select((data, value) => new { Data = data, Value = value }) 
     { 
      a = a + (char)(details.Value + 64) + details.name 
     } 

は、追加機能です名前がリストのどの位置にあるか。ただし、name1の代わりにnameが2回表示されている場合。 b)name1私はa)、b)の名前を取得する必要があります。

これは私が実際に行う方法を理解できないものです。私は誰でも私に与えることができるアドバイスやポインターに感謝します。

+1

。 – Blindy

+0

辞書はあなたの友人になります。人物の名前をキーにして、キーが存在すれば、次の文字をこの 'dict [key]のように値に追加してください。 + = "、" + nextLetter + ")"; ' –

+0

@Blindy - 申し訳ありません。私はそれを記述するのは簡単ではないことが分かった。私が取り組んでいたサンプルコードをいくつか与えました。要件に関するいくつかの言葉と最後の短い例。ほんの少しの単語が追加されました:-) – JonAndMarie

答えて

1

考える:

var persons=new[] {"Fred", "John", "John", "Pete", "John"}; 

をあなたが書くことができます

 char id = 'a'; 
     foreach (var row in persons 
      .Select(w => new { id = id++, name = w }) 
      .GroupBy(w => w.name) 
      .Select(w => w 
       .Select(ww => ww.id + ")") 
       .Aggregate((c, n) => c + "&" + n) 
       + " " + w.Key)) 
     { 
      Console.WriteLine(row); 
     } 

そして、それはあなたを与える:あなたが必要なもの

a) Fred 
b)&c)&e) John 
d) Pete 
+0

Linqが "map"演算子を持っていればいいので、同じチェーンにhacky 'return 0''Select'ステートメントなしで行を書くことができます... – Blindy

+0

あなたの答え非常に効率的に見えます。私はこれを試してみる。ありがとう – JonAndMarie

+0

どこに行くのか分かりませんが、これをメソッドの中で実装すると 'yield returns'がうまくいかないでしょうか? –

1

私はそれを理解していると思いますが、私はメダルに値します。

foreach (var group in _persons 
     .Select((data, value) => new { Data = data, Value = value } 
     .GroupBy (x => x.Data)) 
    { 
     foreach (var item in group) 
      a = a + (char)(item.Value + 64) + ") "; 

     a = a + group.Key; 
    } 
0

これを達成するためにCount()を使用できます。何かを数えなければならないかどうかを判断する機能を持つことができます。

1

は名前で最初のグループにあり、その後に変換それらを文字列に変換します。

var result = names 
    .Select((name, index) => new { Name = name, Prefix = (char)(index + 'a') + ")" }) 
    .GroupBy(p => p.Name, p => p.Prefix) 
    .Select(g => string.Join(" & ", g) + " " + g.Key); 

は、この例では、完全にa), b) & c)事の書式設定を行いません(その代わり、それはa) & b) & c)を与えるが、それはあなたが始める必要があります。私が今まで読んだほとんどのとりとめのない説明である必要があり