-5

私が必要とする目的のために機能する以下のコードがありますが、それをより速くすることができるという考えがあります。このコードを改善できるかどうか教えてください...

主な問題は、「データ」を数回クエリする必要があることです。代わりに使用できるショートカットがないことを確認する必要があります。

data= GetData()// this return ILookup<Tuple(string, string, string),string>
foreach (var v0 in data)
{
    if (v0.Key.Item3 == string.Empty)
    {
        //Get all related data
        var tr_line = data[v0.Key];
        sb.AppendLine(tr_line.First());

        foreach (var v1 in data)
        {
            if (v1.Key.Item2 == string.Empty && v1.Key.Item1 == v0.Key.Item1)
            {
                var hh_line = data[v1.Key];
                sb.AppendLine(hh_line.First());

                foreach (var v2 in data)
                {
                    if (v2.Key.Item1 == v0.Key.Item1 && v2.Key.Item2 != string.Empty && v2.Key.Item3 != string.Empty)
                    {
                        var hl_sl_lines = data[v2.Key].OrderByDescending(r => r);
                        foreach (var v3 in hl_sl_lines)
                        {
                            sb.AppendLine(v3);
                        }
                    }
                }
            }
        }
    }
 } 
4

2 に答える 2

1

よりきれいに、よりlinq:

        var data = GetData();

        foreach (var v0 in data)
        {
            if (v0.Key.Item3 != string.Empty) continue;

            //Get all related data 
            var tr_line = data[v0.Key];
            sb.AppendLine(tr_line.First());

            var hhLines = from v1 in data
                          where v1.Key.Item2 == string.Empty &&
                                v1.Key.Item1 == v0.Key.Item1
                          select data[v1.Key];

            foreach (var hh_line in hhLines)
            {
                sb.AppendLine(hh_line.First());

                var grouping = v0;
                var enumerable = from v2 in data
                                 where v2.Key.Item1 == grouping.Key.Item1 &&
                                       v2.Key.Item2 != string.Empty &&
                                       v2.Key.Item3 != string.Empty
                                 select data[v2.Key].OrderByDescending(r => r)
                                 into hl_sl_lines from v3 in hl_sl_lines select v3;

                foreach (var v3 in enumerable)
                {
                    sb.AppendLine(v3);
                }
            }
        }
于 2012-09-14T13:16:48.237 に答える
1

まず第一に、この種のコードに Tuple を使用しないようにしてください。なぜなら、今から数か月後には、このコードは理解できなくなるからです。クラスを作成するか、さらに良いことに、正しいプロパティ名を持つ不変の構造体を作成します。どんなに速いコードでも、保守できなければ意味がありません。

つまり、同じコレクションを反復する 3 つのネストされたループがあります。隣接するアイテムとのみ比較する必要があるため、並べ替えられたコレクションのパフォーマンスが向上する可能性があります。

達成しようとしていることを説明してください。そうすれば、誰かがより具体的な助けを提供しようとします.

于 2012-09-14T13:10:44.057 に答える