LINQ:如何添加多个字段进行分组

本文关键字:字段 何添加 添加 LINQ | 更新日期: 2023-09-27 17:56:45

此代码对序号位置为 12 的当事方名称应用分组

group line by line[12] into newGroup 

现在我想知道如何在序数位置为 0 表示line[0]的多个字段上应用 group

line[0]将同时具有日期和时间。 我只是喜欢按时间部分分组。 这样我就可以提取时间部分

DateTime.Parse(line[0].Substring(line[0].Length-8))
var csvlines = File.ReadAllLines(@"M:'smdr(backup08-06-2015).csv");
var csvLinesData = csvlines.Skip(1).Select(l => l.Split(',').ToArray());
var groupOfUser = from line in csvLinesData 
                  group line by line[12] into newGroup 
                  orderby newGroup.Key 
                  select newGroup;
var user = (from userOfGrp in groupOfUser
            select
                new User()
                    {
                        CSRName = userOfGrp.Key,
                        Incomming = userOfGrp.Count(x => x[4] == "I"),
                        Outgoing = userOfGrp.Count(x => x[4] == "O")
                    }).ToList();

1)只需帮助我在多个字段上进行分组,一个是行[12],另一个是行[0]2)line[0]将有日期和时间部分,例如"2015/06/08 07:59:12",我必须仅在line[0]的时间部分应用组

编辑 1

此行group r by new { prop1 = r[12], ((DateTime)r[0]).TimeOfDay } into g引发错误 无法将类型"字符串"转换为"系统.日期时间"

void Main()
{
    var csvlines = File.ReadAllLines(@"c:'smdr.csv");
            var csvLinesData = csvlines.Skip(1).Select(l => l.Split(',').ToArray());
            var csvData = csvLinesData.Where(l => (l[6] != "VM Channel" && l[6] != "Voice Mail")).ToArray();
            var user = (from r in csvData
                        group r by new { prop1 = r[12], Time = ((DateTime)r[0]).TimeOfDay } into g
                        orderby g.Count()
                        select new User 
                        {
                            CSRName=g.Key,
                            Incomming=(from r1 in g
                                      where r1[3]=="I"
                                      select r1).Count(),
                            outgoing = (from r1 in g
                                        where r1[3] == "O"
                                        select r1).Count()
                        }).ToList();
}
class User
{
    public string CSRName;
    public int outgoing;
    public int Incomming;
}

LINQ:如何添加多个字段进行分组

如果我很了解你,你需要这个:

from line in csvLinesData 
group line by new 
              { 
                  prop1 = line[12],
                  Time = DateTime.Parse(line[0]).TimeOfDay
               } into newGroup 
orderby newGroup.Key.prop1, newGroup.Key.Time 
select newGroup;

由于line[0]显然是一个字符串,因此您必须将其解析为DateTime值。我展示了最简单的方法来做到这一点,但也许你应该构建一些更安全的东西,因为不是每个字符串都可以解析为DateTime。但这超出了这个问题的范围。

请注意,匿名类型具有命名属性,您可能希望重命名prop1