在 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
对象的其他枚举,然后可以遍历这些子枚举并执行我需要做的事情。
我有一个 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
对象的其他枚举,然后可以遍历这些子枚举并执行我需要做的事情。