2011-06-21 137 views
-1

我知道LINQ,但我的知識幾乎只有選擇,where,orderby和所有最常用的功能。現在我需要做一些我認爲非常困難的事情,並且可能甚至不可能只使用LINQ。我擁有的是一個人的名單。東部 查詢,但我需要從該列表中創建一個文本字符串。文本字符串必須給出一個字母,後面跟着每個人的名字。複雜的LINQ查詢

IList<person> Person 

我需要能夠通過檢查Person列表的LINQ語句。我需要 才能查找出現多次的名稱。到目前爲止,我有以下幾點。它的工作原理好,但是沒有得到所需要的一切:

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 
     } 

我需要的是額外的功能,以便:

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." 

換句話說,得到的名字和之前他們表演把人物該名稱在列表中的位置。但是,如果名稱出現兩次,而不是a)name1。 b)姓名1我需要得到a),b)姓名。

這是我無法弄清楚如何去做的事情。我會很感激任何人都可以給我的建議或指示。

+1

那必須是我讀過的最不着邊際的解釋。 「什麼?」是唯一想到的。 – Blindy

+0

詞典將在這裏成爲你的朋友。將Person的名字作爲一個鍵,如果鍵存在,將下一個字母添加到像這樣的值'dict [key] + =「,」+ nextLetter +「)」;' –

+0

@Bindindy - 對不起。我發現描述起來並不容易。我給了我一直在努力的一些示例代碼。關於要求和最後一些簡短例子的一些話。再加上幾個詞以防萬一:-) – 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有一個「映射」操作符,這樣我就可以在同一個鏈中寫出這些行,而不需要'返回0''選擇'語句... – Blindy

+0

您的答案看起來非常有效。我會試試這個。謝謝 – JonAndMarie

+0

不知道你要去哪裏,但如果你在一個方法裏面實現這個功能,'yield return'不工作嗎? –

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),但它應該讓你開始。