簡體   English   中英

如何按屬性對對象列表進行排序

[英]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++;
        }

statusesinfos每個最多可以有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.

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