Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

方法: LINQ クエリのカスタム メソッドを追加する??

$
0
0

ノイエ先生が突然きれてたので、試してみました。前半がMSDNからのこぴぺ。後半が自分なりになおしてみたやつ。

staticclass LINQExtension
    {
        publicstaticdouble Median(this IEnumerable<double> source)
        {
            if (source.Count() == 0)
            {
                thrownew InvalidOperationException("Cannot compute median for an empty set.");
            }

            var sortedList = from number in source
                             orderby number
                             select number;

            int itemIndex = (int)sortedList.Count() / 2;

            if (sortedList.Count() % 2 == 0)
            {
                // Even number of items.return (sortedList.ElementAt(itemIndex) + sortedList.ElementAt(itemIndex - 1)) / 2;
            }
            else
            {
                // Odd number of items.return sortedList.ElementAt(itemIndex);
            }
        }

        publicstaticdouble MedianEx(this IEnumerable<double> source)
        {
            var items = source.OrderBy(d => d).ToArray();
            if (!items.Any())
            {
                thrownew InvalidOperationException("Cannot compute median for an empty set.");
            }

            int itemIndex = items.Length / 2;
            if (items.Length % 2 == 0)
            {
                return (items[itemIndex] + items[itemIndex - 1]) / 2;
            }
            else
            {
                return items[itemIndex];
            }
        }
    }

Ix-MainをNuGetで参照にくわえて10000個くらいのdoubleの配列に対して1000回くらいループ回してみて時間はかってみました。

var source = EnumerableEx.Generate(0.0, d => d <= 10000.0, d => ++d, d => d);
{
    var stopwatch = Stopwatch.StartNew();
    for (int i = 0; i < 1000; i++)
    {
        source.Median();
    }
    stopwatch.Stop();
    Console.WriteLine("Median: {0}ms", stopwatch.ElapsedMilliseconds);
}
{
    var stopwatch = Stopwatch.StartNew();
    for (int i = 0; i < 1000; i++)
    {
        source.MedianEx();
    }
    stopwatch.Stop();
    Console.WriteLine("MedianEx: {0}ms", stopwatch.ElapsedMilliseconds);
}
Median: 7290ms
MedianEx: 2538ms

ふむ2倍以上遅い。

ということで、何故遅いのかは夜遅いので誰かにパス・・・!


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>