[英]How to sort a list of objects by a property
我有這段代碼:
DataTable dt = new DataTable();
dt.Columns.Add("Status");
dt.Columns.Add("File");
dt.Columns.Add("Revision");
int i = 0;
foreach (SvnStatusEventArgs status in statuses) // statuses is a Collection
{
dt.Rows.Add();
switch (status.LocalContentStatus)
{
case SvnStatus.NotVersioned:
dt.Rows[i]["Status"] = "Not Versioned";
break;
default:
dt.Rows[i]["Status"] = status.LocalContentStatus.ToString();
break;
}
dt.Rows[i]["File"] = status.Path;
foreach(SvnInfoEventArgs info in infos) //infos is a Collection
{
if (status.Path.Equals(info.Path))
{
dt.Rows[i]["Revision"] = info.Revision;
break;
}
}
i++;
}
statuses
和infos
每個最多可以有2萬行,因此,我的嵌套foreach可能需要很長時間。
我想,如果我將這些Collections轉換為Lists,然后嘗試按Path
對其進行排序,則可能會加快速度。
在MSDN頁面上查看Sort方法,我不知道如何比較SvnStatusEventArgs [n]和SvnStatusEventArgs [n + 1]中的Path
字段。 然后我也開始懷疑,因為我要遍歷這兩個對象組並對其進行排序,這真的比我現有的代碼更有效嗎? 我想它將是n * 2而不是n * n,對嗎?
對於它的價值,我嘗試排序的Path
字段只是一個字符串。
您可以創建一個Dictionary<string, int>
(鍵是路徑,值是修訂)。
Dictionary<string, int> pathRevisions = infos
.GroupBy(info => info.Path)
.ToDictionary(group => group.Key, group => group.First().Revision);
.... 在循環:
int revision;
if(pathRevisions.TryGetValue(status.Path, out revision))
dt.Rows[i].SetField("Revision", revision);
您的問題還不清楚,但是既然您在評論中說過,這就是您的意思。
foreach (SvnStatusEventArgs status
in statuses
.OrderBy(x => x.Path))
但是,這是一個非常基本的方法。 如果您想要一個更好的解決方案,則應使用Tim Schmelter的解決方案。
最好的辦法就是在信息字典上-用鍵作為路徑。 那將是最有效的整體。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.