如何按属性对对象列表进行排序

sab*_*669 0 .net c# performance .net-3.5

我有这段代码:

        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++;
        }
Run Code Online (Sandbox Code Playgroud)

statuses并且infos可以在每个高达20K行,然而,我的嵌套的foreach可能需要很长的时间.

如果我将这些集合转换为列表然后尝试对它们进行排序,我想我可以加快速度Path.

查看Sort方法的MSDN页面,我不知道如何比较PathSvnStatusEventArgs [n]和SvnStatusEventArgs [n + 1]中的字段.然后我也开始怀疑,因为我将完全迭代这两组对象并对它们进行排序,这真的比我现有的代码更有效吗?我想它会是n*2而不是n*n,对吗?

对于它的价值,Path我试图排序的字段只是一个字符串.

Tim*_*ter 5

您可以创建一个Dictionary<string, int>(关键是路径和修订版的值).

Dictionary<string, int> pathRevisions = infos
    .GroupBy(info => info.Path)
    .ToDictionary(group => group.Key, group => group.First().Revision);
Run Code Online (Sandbox Code Playgroud)

.... 在循环:

int revision;
if(pathRevisions.TryGetValue(status.Path, out revision))
    dt.Rows[i].SetField("Revision", revision);
Run Code Online (Sandbox Code Playgroud)

  • 它更高效的sice它不需要循环它来找到对象.该方法接近O(1)操作,这意味着它无关紧要. (2认同)