C#:计算元组列表中的不同值

时间:2017-04-29 10:06:48

标签: c# list linq

我试图获得每个学生的相同日期总数。我已将日期时间转换为星期几(int)。 GetAllInfo从其他类接收所有需要的数据。然后GetTimeExercises使用这些数据。

列表中的数据示例ExercisesWithTime:(291,5)(301,5)(291,5)

291是学生ID,5是星期几。

现在我想计算列表中的所有重复值,并将总数添加到列表或字典中。 通缉结果:学生ID +总天数

所以例如:(291,5)(301,5)(291,5)应该给(291,2)(301,5)

private List<Tuple<int, int>> ExcercisesWithTime = new List<Tuple<int, int>>(); 

public void GetAllTimeWithExercises()
{
    GetAllInfo();
    GetTimeExercise(AllStudentInfo);          
} 

private void GetTimeExercise(List<IctLabTable> studentInfo)
{
    foreach (var item in studentInfo)
    {
        ExcercisesWithTime.Add(new Tuple<int, int>(item.StudentId, ConvertDayOfWeek(item.CreatedAt)));                
    }            
}

private int ConvertDayOfWeek(DateTime dateValue)
{
    int dayOfWeek = (int) dateValue.DayOfWeek;

    return dayOfWeek;
}

我尝试了不同的东西,但没有成功。我尝试通过创建字典来解决它:

private Dictionary<int, Tuple<int, int>> StudentDayTotalExercises = new Dictionary<int, Tuple<int, int>>();

//// Studentid + day (Example: 291 + 5)
private void CountSameDays(List<Tuple<int, int>> xList)
{
    foreach (var item in xList)
    {
        var TotalDays = 1;

        if (!StudentDayTotalExercises.ContainsKey(item.Item1))
        {
            var TupleStudentDays= new Tuple<int, int>(item.Item2, TotalDays );
            StudentDayTotalExercises.Add(item.Item1, TupleStudentDays);
        }

        else
        {
            Here I wanted to increment the value if the key existed. But without success.
            //StudentDayTotalExercises[item.Item1, ]++;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

只需按Tuple分组并计算出现次数:

List<Tuple<int, int>> excercisesWithTime = new List<Tuple<int, int>>
{
    Tuple.Create(291, 5),
    Tuple.Create(301, 5),
    Tuple.Create(291, 5)
};

// method syntax
var result = excercisesWithTime.GroupBy(key => key, item => 1)
                               .Select(group => new { 
                                   group.Key, 
                                   Duplicates = group.Count() 
                               });

//query syntax
var result = from item in excercisesWithTime
             group 1 by item into g
             select new {
                 g.Key,
                 Duplicates = g.Count()
             };

我建议您使用属性创建一个合适的类,而不是使用Tuple。使用更清晰,您无需记住每个ItemX中放置的内容。

如果您使用的是C#7.0,请参阅其有关元组的功能