如何在 C# 中获取字典值 Collection 的计数

How to get count of Dictionary Value Collection in C#

我正在尝试获取字典值 collection 的计数,其中 collection 项的字段与 collection 中的键以及类型。

所以我的 collection 看起来像这样,注意 object 已初始化,这只是伪代码:

var results = Dictionary<string, List<CourseEnrollmentsByStudentSQLResult>();

现在 CourseEnrollmentsByStudentSQLResult 是一个数据传输 object,映射到从我的查询返回的行。

public class CourseEnrollmentsByStudentSQLResult
{
    public int StudentID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string College { get; set; }
    public int CollegeId { get; set; }
    public string Prefix { get; set; }
    public string CourseNumber { get; set; }
    public string Course { get; set; }
    public int CourseId { get; set; } 
    public string Program { get; set; }
    public string Term { get; set; }
    public string Status { get; set; }
    public List<StudentCoursesSQLResult> Courses { get; set; }
}

您会注意到我的 CourseEnrollmentsByStudentSQLResult class 也有一个 collection of StudentCoursesSQLResult objects。这是我要根据两个条件计算的列表。

首先,课程(字典中的字符串 KEY)与 StudentCoursesSQLResult 的课程相匹配,然后我需要过滤 StudentCoursesSQLResult.类型.

这是 StudentCoursesSQLResult class:

public class StudentCoursesSQLResult
{
    public int StudentID { get; set; }
    public int Position { get; set; }
    public string Prefix { get; set; }
    public string CourseNumber { get; set; }
    public string Course { get; set; }
    public string Type { get; set; }
}

现在要获取计数,我正在遍历我的字典并为每个键输出 headers,这是我尝试输出字典值 collection 的计数。

    foreach(var result in results) {
       <span class="label label-default label-fat">
          @result.Value.SelectMany(r => r.Courses).Count(c => c.Course == result.Key && c.Type == "required")
       </span>
    }

但由于某种原因它返回零,而我知道它不应该。

有人能给我指出正确的方向吗?到目前为止我在网上找到的所有东西都说使用 SelectMany,但我没有任何运气。

这是字典值 collection 的单个课程的调试输出屏幕截图,其中类型为 "required"。

查看您的屏幕截图,"Advanced French I: Structure and Expression""Medieval Art and Architecture" 的键不匹配,这解释不正确的计数。

相反,将 CourseEnrollmentsByStudentSQLResult 集合过滤为与字典键匹配的那些,然后 select 这些匹配记录中的所有课程,最后计算 "required" 的课程。

@result.Value.Where(r => r.Course == result.Key)
             .SelectMany(r => r.Courses)
             .Count(c => c.Type == "required");

vivat 的变体,如果您想在程序中执行此操作:

  var cnt = selections.Where(r => r.Key == "Items").SelectMany(r => r.Value).Count();

“Items”是集合中的键值。在我的例子中,我创建了这个集合:

  Dictionary<string, string[]> selections = new Dictionary<string, string[]>();

然后添加了一组基于键的简单值:

  selections.Add("Items", txtItems.Text.Replace("\n", "").Split('\r')); 

后来想看看有没有设置值,所以就用上面的方法来统计。它运行良好,在初始测试中它帮助我发现我需要在设置之前清理文本条目。