2011-06-21 134 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),但它应该让你开始。