我有一个分享名单,我们称之为学生。
name | surname | username
------|---------|----------
test | test1 | test11
test2 | test2 | test22
test3 | test3 | test33
我根据经理保留学生姓名,并添加到sharepoint列表;
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() });
它还使我重新计算逗号“,”有什么方法可以避免这种情况吗? 还有什么方法可以将它们与单个查询合并?
答案 0 :(得分: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()});
(您可以将这些组合成一个查询。)
答案 1 :(得分: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();
这将允许您创建一个循环,遍历列表中的每个学生并获取相关经理的计数