基于数组索引对列表数组进行排序

时间:2019-01-06 14:21:56

标签: c# list sorting

我想基于数组项对列表数组进行排序。 我有一个字符串列表数组,如下所示:

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));

任何人都可以向正确的方向暗示。谢谢。

5 个答案:

答案 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;
    }

然后您的程序应打印以下内容: enter image description here