[英]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
,然后在其中添加所需的所有字段。 將來會更好,更可擴展。 然后創建一個項目List
或Array
,並使用OrderBy()
函數根據所需字段進行排序。
List<Project> projects = new List<>();
// Fill the list...
projects.OrderBy(project => project.Status);
Status
字段必須是原始類型,或者需要實現IComparable
接口才能進行排序。 我建議您為帶有Status
的int
值添加一個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.