在 C# 中对多级列表进行排序,其中内层包含类型对象列表

Sort multi-level list in C# where the inner layer contains a list of typed objects

我有一个 List 包含多个 Lists,它们本身包含类型对象:

List<List<Activity>> SortActivities

Activity 类型的对象如下所示:

public class Activity
{
    public DateTime Date { get; set; }
    public string ProjectnumberUnformatted { get; set; }
    public int Year 
    { 
        get
        {
            return Date.Year;
        }
    }
    public int Month
    { 
        get
        {
            return Date.Month;
        }
    }
    public string MonthYear 
    { 
        get
        {
            return Month + " / " + Year;
        }
    }
    public string Customer 
    {
        get 
        {
            return ProjectnumberUnformatted.Split('/')[0];            
        } 
    }
    public string ProjectnumerFormatted 
    { 
        get
        {
            return ProjectnumberUnformatted.Split('/')[2];
        }      
    }
    public string MonthString 
    {
        get
        {
            switch (Month)
            {
                case 1:
                        return "Januar";
                case 2:
                        return "Februar";
                case 3:
                        return "März";
                case 4:
                        return "April";
                case 5:
                        return "Mai";
                case 6:
                        return "Juni";
                case 7:
                        return "Juli";
                case 8:
                        return "August";
                case 9:
                        return "September";
                case 10:
                        return "Oktober";
                case 11:
                        return "November";
                case 12:
                        return "Dezember";
                default:
                        return "Invalid";
            }
        }
    }
    public string Start { get; set; }
    public string Pause { get; set; }
    public string End { get; set; }
    public string Description { get; set; }
    public string Comment { get; set; }
}

在程序启动时,我有一个包含未排序活动的对象 List<Activity>。但是,每个 activity 都应按其项目编号排序。所以我需要实现一种方法,将 List<Activity> 对象中的每个 activity 排序到它自己的 List<Activity> 中,并将项目编号作为排序参数。然后将生成的列表放入 List<List<Activity>>.

如果可能的话,我只需要一个基本的流程图和一个简单的算法来完成这项工作,因为我真的不知道如何开始。

听起来您确实想要一本字典,其中键是项目编号,值是活动列表。听起来像是 LINQ 的理想工作:

List<Activity> activities = new List<Activity>
{
    new Activity { ProjectnumberUnformatted = "abc" },
    new Activity { ProjectnumberUnformatted = "def" },
    new Activity { ProjectnumberUnformatted = "abc" },
    new Activity { ProjectnumberUnformatted = "abc" },
    new Activity { ProjectnumberUnformatted = "def" },
    new Activity { ProjectnumberUnformatted = "ghi" },
    new Activity { ProjectnumberUnformatted = "def" },
};

Dictionary<string, List<Activity>> activitiesKeyedOnProjectNumber = (
    from activity in activities
    group activity by activity.ProjectnumberUnformatted into grouped
    select new { key = grouped.Key, value = grouped.ToList() }
    ).ToDictionary(
        keySelector: x => x.key,
        elementSelector: x => x.value
        );

您不想对对象进行排序,而是想对它们进行分组。 您需要做的是传递集合中的所有元素,并将它们中的每一个分配给具有正确标识符的组。 在这种情况下,Dictionary<key,List<object>> 将是更好的数据结构选择。

Dictionary<string, List<ISortableObject>> Sort(List<ISortableObject> items)
{
  var result = new Dictionary<string, List<ISortableObject>>();
  foreach(var item in items)
  {
    if (!result.ContainsKey(item.SortingKey))
    { result[item.SortingKey]=new List<ISortableObject>(); }
    result[item.SortingKey].Add(item);
  }
}

好的,谢谢大家的回答。我稍微研究了 LINQ 并提出了一个非常简单的语句来满足我的目的:

var groupedActivities = activities.GroupBy(p => p.ProjectnumberUnformatted);

有了这个,我得到了一个枚举,其中包含类型化 Activity 对象的其他枚举,然后可以遍历这些子枚举并执行我需要做的事情。