Linq独特的价值观

时间:2011-04-04 08:26:44

标签: linq

我有一个泛型类的列表,它包含2个字符串属性和1个List作为属性

代码片段如下:

public Class abc
{
    public int ID { get; set; }
    public String Name { get; set; }
    List<String> myList;
    public List<String> Subjects
    {
        get
        {
            if (myList == null)
            {
                myList = new List<string>();
            }
            return myList;
        }            
    }
    public abc()
    {
    }
    public abc(int id, String name, params string[] subjects)
    {
        Subjects.AddRange(subjects.AsEnumerable<String>());
        ID = id;
        Name = name;

    }
}

List<abc> myList = new List<abc>();    
 myList.Add(new abc(1, "p1", "Maths", "Science"));
 myList.Add(new abc(2, "p2", "Maths", "Art"));
 myList.Add(new abc(3, "p3", "Art", "Science"));    
 myList.Add(new abc(4, "p4", "Geometry", "Maths"));

我需要输出

Subject Count  Person

Maths    3     p1,p2,p4

Science  2     p1,p3

Art      2     p2,p3

Geometry 1     p4

2 个答案:

答案 0 :(得分:4)

看起来像你想要的东西:

var query = from item in myList
            from subject in item.Subjects
            group item.Name by subject into g
            select new { Subject = g.Key,
                         Count = g.Count(),
                         Person = string.Join(",", g) };

(如果您使用的是.NET 3.5,请在g调用中将g.ToArray()更改为string.Join。)

答案 1 :(得分:0)

var result =myList.SelectMany(p => p.Subjects
                                .Select(q => new{Person = p.Name, Subject = q, ID = p.ID}))
                            .GroupBy(p => p.Subject)
                            .Select(p => new {Name = p.Key, Count = p.Count(), Persons = p
                                .Aggregate("", (a, b) => a + b.Person
+ ",").TrimEnd(',')}).OrderBy( p => p.Count);

迭代此集合,并根据需要打印结果 - 结果的属性为Name,Count,Persons