Linq唯一值

Linq唯一值,linq,Linq,我有一个泛型类的列表,它由2个字符串属性和1个列表作为属性组成 SNIPNET代码如下: public Class abc { public int ID { get; set; } public String Name { get; set; } List<String> myList; public List<String> Subjects { get { if (myL

我有一个泛型类的列表,它由2个字符串属性和1个列表作为属性组成

SNIPNET代码如下:

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"));

看起来你想要的是:

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) };
(在
字符串中将
g
更改为
g.ToArray()
。如果使用.NET 3.5,请加入
调用。)

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

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) };
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);