0

我有这段代码:

        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每行最多可以有 20K 行,因此我的嵌套 foreach 可能需要很长时间。

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

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

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

4

3 回答 3

5

您可以创建一个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);
于 2013-10-23T14:45:10.627 回答
1

你的问题相当不清楚,但既然你在评论中说这就是你的意思

foreach (SvnStatusEventArgs status 
         in statuses
         .OrderBy(x => x.Path))

这是一个非常基本的方法。如果您想要一个更优化的方案,您应该使用 Tim Schmelter 的解决方案。

于 2013-10-23T14:44:17.100 回答
1

最好的办法就是制作一个关于信息的字典 - 以键为路径。这将是最有效的整体。

于 2013-10-23T14:45:36.430 回答