0

我有一个共享点列表,我们称之为学生。

name  | surname | username
------|---------|---------- 
test  | test1   | test11
test2 | test2   | test22
test3 | test3   | test33

我根据经理保留学生姓名,添加到共享点列表中;

String.Join(",", ListBox2.Items.Cast<ListItem>().Select(i => i.Text).ToArray());

我有另一个列表让我们称之为管理

manager | students      
--------|---------------
man1    | test11,test22 
man2    | test33,test11 

所以我需要的是柜台表中每个学生的经理人数;

studentuName     |   count
-----------------|---------
test11           |    2
test22           |    1
test33           |    1

我将它们称为列表(会有更多更好的方法来调用它们,我只是举例)

List<string> students (has value "test11", "test22", "test33")
List<string> manages (has value "test11,test22" , "test33,test11")

那么我怎样才能得到这个,每个学生有多少个经理,linq?

谢谢你


用@Servy 的答案编辑我可以得到

List<string> managers = new List<string> { "a,b", "a,b,c,d", "a,c", "c,d,f", "a,f,c,b" }; 

var query = managers.SelectMany(manager => manager.Select(student => new { manager, student })); 

var finalQuery = query.GroupBy(pair => pair.student).Select(group => new { Student = group.Key, Count = group.Count() });

它还让我计算逗号“,”有什么办法可以避免这种情况吗?还有什么方法可以将它们与单个查询合并?

4

2 回答 2

1

首先,我们将经理列表从具有多值学生列表的单值经理转换为每个“行”都有一个经理和一个学生。我们将通过在经理列表的该值中为每个学生创建额外的“行”来做到这一点。

var query = managers.SelectMany(manager => 
    manager.students.Select(student => new { manager, student }));

现在我们可以将这些项目分组student并计算组的大小:

var finalQuery = query.GroupBy(pair => pair.student)
    .Select(group => new { Student = group.Key, Count = group.Count()});

(您可以将它们组合成一个查询。)

于 2013-11-05T18:16:47.777 回答
0

试试这个。我认为这是你想要完成的:

  List<string> Students = new List<string>() { "Test1", "Test2" };
  List<string> Manager = new List<string>(){"Test1","Test1","Test3"};

            var counter = Manager.Count(m => m == Students[0]);
            Console.WriteLine(counter);
            Console.ReadLine();

这将允许您创建一个循环,遍历列表中的每个学生并获取相关经理的数量

于 2013-11-05T18:06:40.810 回答