如何使用linq获得基于sharepoint列表的包含计数?

时间:2013-11-05 12:39:06

标签: c# linq sharepoint

我有一个分享名单,我们称之为学生。

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

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

2 个答案:

答案 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();

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