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++;
        }

statusesinfosただし、それぞれ最大 20,000 行を保持できるため、ネストされた foreach には長い時間がかかる可能性があります。

これらのコレクションをリストに変換してから、両方を並べ替えようとすると、これを高速化できると思いましたPath

Sort メソッドのMSDN ページを見ても、PathSvnStatusEventArgs[n] と SvnStatusEventArgs[n+1] のフィールドを比較する方法がわかりません。それから、これらのオブジェクトのグループの両方を全体的に反復処理し、とにかくそれらをソートするので、それは既存のコードよりも本当に効率的でしょうか? n*n ではなく n*2 になると思いますよね?

価値があるのは、Path並べ替えようとしているフィールドは単なる文字列です。

4

3 に答える 3

5

You could create a Dictionary<string, int>(the key is the path and the value the revision).

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

.... in the loop:

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 に答える