我想基于数组项对列表数组进行排序。 我有一个字符串列表数组,如下所示:
List<String>[] MyProjects = new List<String>[20];
通过循环,我添加了五个字符串
(ID,名称,开始日期,结束日期,状态)
从另一个详细的列表来源访问20个项目中的每个项目。
for(int i = 0; i<20; i++){
MyProjects[i].Add(DetailedProjectList.Id.ToString());
MyProjects[i].Add(DetailedProjectList.Name);
MyProjects[i].Add(DetailedProjectList.StartDate);
MyProjects[i].Add(DetailedProjectList.EndDate);
MyProjects[i].Add(DetailedProjectList.Status)}
状态值为
“慢”,“正常”,“快速”,“暂停”和“”表示未知状态。
基于状态,我想对MyProject列表数组进行排序。
我所做的是我创建了另一个列表,如下所示
List<string> sortProjectsBy = new List<string>(){"Slow", "Normal", "Fast", "", "Suspended"};
我尝试如下进行排序,但是没有成功。
MyProjects = MyProjects.OrderBy(x => sortProjectsBy.IndexOf(4));
任何人都可以向正确的方向暗示。谢谢。
答案 0 :(得分:2)
我建议您创建类Project
,然后在其中添加所需的所有字段。将来会更好,更可扩展。然后创建一个List
或一个Array
项目,并使用OrderBy()
函数根据您想要的字段进行排序。
List<Project> projects = new List<>();
// Fill the list...
projects.OrderBy(project => project.Status);
字段Status
必须是原始类型,或者需要实现接口IComparable
才能进行排序。我建议您为enum
添加一个Status
值的int
。
答案 1 :(得分:1)
首先考虑也许使用Enum来获取状态,然后将其放在其他文件精简版(实用程序或类似文件)中,这样可以更好地工作。
enum Status {"Slow"=1, "Normal", "Fast", "", "Suspend"}
现在,要实现此过滤的操作是这样的(您需要告诉x指的是哪个属性。在这种情况下,是状态)
MyProjects = MyProjects.OrderBy(x => x.status == enum.Suspend);
阅读有关枚举的信息: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/enum
了解lambda表达式: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions
答案 2 :(得分:0)
首先,将项目详细信息存储为List是不可取的。您需要创建一个自定义类来表示它们。 例如,
public class DetailedProjectList
{
public string Name {get;set;}
public eStatus Status {get;set;}
// rest of properties
}
然后您可以使用
var result = MyProjects.OrderBy(x=> sortProjectsBy.IndexOf(x.Status));
例如
List<string> sortProjectsBy = new List<string>(){"Slow", "Normal", "Fast", "", "Suspended"};
var MyProjects= new List<DetailedProjectList>{
new DetailedProjectList{Name="abc1", Status="Fast"},
new DetailedProjectList{Name="abc2", Status="Normal"},
new DetailedProjectList{Name="abc3", Status="Slow"},
};
var result = MyProjects.OrderBy(x=> sortProjectsBy.IndexOf(x.Status));
输出
abc3 Slow
abc2 Normal
abc1 Fast
一种更好的方法是使用Enum表示状态。
public enum eStatus
{
Slow,
Normal,
Fast,
Unknown,
Suspended
}
那么您的代码可以简化为
var MyProjects= new List<DetailedProjectList>{
new DetailedProjectList{Name="abc1", Status=eStatus.Fast},
new DetailedProjectList{Name="abc2", Status=eStatus.Normal},
new DetailedProjectList{Name="abc3", Status=eStatus.Slow},
};
var result = MyProjects.OrderBy(x=> x.Status);
答案 3 :(得分:0)
好的,所以您有20个项目的集合。基于它们,您需要创建一个字符串列表(20个DetailedProjectList项目)。
您可以解决的问题是在创建字符串列表之前先对您的收藏进行排序。这样,您的字符串列表将被排序。
但是您的代码根本不是最佳的。因此,您应该在许多层面上考虑优化。
答案 4 :(得分:0)
假设您有如下的ProjectDetail类:
private class ProjectDetail
{
public int Id {get;set;}
public string Name {get;set;}
DateTime StartDate {get;set;} = DateTime.Now;
DateTime EndDate {get;set;} = DateTime.Now;
public string Status {get;set;}
public string toString => $"{Id} - {Name} - {StartDate} - {EndDate} - {Status}";
}
请注意,我已经添加了toString属性以简化操作,并且还添加了默认值。
然后您的程序可能类似于:
static void Main(string[] args)
{
var projectDetails = MockProjectItems();
Console.WriteLine("Before sortig:");
foreach (var item in projectDetails)
{
Console.WriteLine(item.toString);
}
var myProjects = projectDetails.OrderBy(p => p.Status).Select(p => p.toString);
Console.WriteLine("\n\nAfter sorting:");
foreach (var item in myProjects)
{
Console.WriteLine(item);
}
}
辅助方法在哪里
private static List<ProjectDetail> MockProjectItems()
{
var items = new List<ProjectDetail>(20);
for(int i = 0; i < 20 ; i += 4){
items.Add(new ProjectDetail{Id = i, Name = "RandomName "+i, Status = "Slow"});
items.Add(new ProjectDetail{Id = i+1, Name = "RandomName "+(i+1), Status = "Normal"});
items.Add(new ProjectDetail{Id = i+2, Name = "RandomName "+(i+2), Status = "Fast"});
items.Add(new ProjectDetail{Id = i+3, Name = "RandomName "+(i+3), Status = "Suspended"});
}
return items;
}