簡體   English   中英

基於數組索引對列表數組進行排序

[英]Sorting List Array based on an index of array

我想基於數組項對列表數組進行排序。 我有一個字符串列表數組,如下所示:

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 Array進行排序。

我所做的是我創建了另一個列表,如下所示

List<string> sortProjectsBy = new List<string>(){"Slow", "Normal", "Fast", "", "Suspended"};

我嘗試如下進行排序,但未成功。

MyProjects = MyProjects.OrderBy(x => sortProjectsBy.IndexOf(4));

任何人都可以向正確的方向暗示。 謝謝。

我建議您創建類Project ,然后在其中添加所需的所有字段。 將來會更好,更可擴展。 然后創建一個項目ListArray ,並使用OrderBy()函數根據所需字段進行排序。

List<Project> projects = new List<>();
// Fill the list...
projects.OrderBy(project => project.Status);

Status字段必須是原始類型,或者需要實現IComparable接口才能進行排序。 我建議您為帶有Statusint值添加一個enum

首先考慮也許使用Enum作為狀態並將其放在其他文件lite(utils或其他文件)中-更好地像這樣工作。

enum Status {"Slow"=1, "Normal", "Fast", "", "Suspend"}

現在,關於要實現的過濾,請按以下步驟進行操作(您需要確定所指的是x的哪個屬性。在這種情況下,就是狀態)

MyProjects = MyProjects.OrderBy(x => x.status == enum.Suspend);

閱讀有關枚舉的信息: https : //docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/enum

閱讀有關Lambda表達式的信息: https : //docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/statements-expressions-operators/lambda-expressions

首先,將項目詳細信息存儲為“列表”是不可取的。 您需要創建一個自定義類來表示它們。 例如,

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

好的,所以您有20個項目的集合。 基於它們,您需要創建一個字符串列表(20個DetailedProjectList項目)。

解決問題的方法是在創建字符串列表之前先對您的收藏進行排序。 這樣,您的字符串列表將被排序。

但是您的代碼根本不是最佳的。 因此,您應該在許多層面上考慮優化。

假設您有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;
    }

然后,您的程序應打印以下內容: 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM