2012年01月30日
川俣晶の縁側技術関連執筆情報『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポートtotal 18569 count

差し替え・Minで目的の値に最も近い値を選ぶ

Written By: 川俣 晶連絡先

 本文のサンプルソースでは値によって誤動作するので差し替えます。(257ページ)

Minで目的の値に最も近い値を選ぶ §

 最大でも最小でもない値をMin/Maxメソッドで選ぶのは難しいように思える。しかし、一歩引いて考えるとそうでもない。「目的の値に最も近い値を選ぶ」という要求は、「目的の値との差の絶対値が最小の値を選ぶ」と読み替えればMinメソッドで処理可能だ。

using System;

using System.Linq;

class Program

{

    static void Main()

    {

        const int target1 = 10;

        const int target2 = 13;

        int[] a = { 8, 11, 12 };

        int min1 = a.Min(c => Math.Abs(c - target1));

        Console.WriteLine("{0}にいちばん近い値は{1}です。", target1, a.First(c => Math.Abs(c - target1) == min1));

        int min2 = a.Min(c => Math.Abs(c - target2));

        Console.WriteLine("{0}にいちばん近い値は{1}です。", target2, a.First(c => Math.Abs(c - target2) == min2));

    }

}

実行結果:

10にいちばん近い値は11です。

13にいちばん近い値は12です。

 この場合、「差の最小値」をMinメソッドは求めるが、それは目的とする値との差である。しかし、この値からは符合に関する情報が失われているので、もう1回Firstメソッドでその値を持つ要素を検索して元の値を取得して出力している。

 ちなみに、Math.Min/Math.MaxメソッドにはLINQに同じ名前のMin/Maxメソッドがあるが、Math.Absメソッドは対応するLINQのメソッドは無い。なぜならMath.Absメソッドの効能は1つの値の絶対値を得ることだけで、シーケンスとは何ら関係ないからだ。

Facebook

キーワード【 川俣晶の縁側技術関連執筆情報『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート
【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】の次のコンテンツ
2012年
01月
30日
Part-2のthisキーワードの欠落について
3days 0 count
total 3436 count
【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】の前のコンテンツ
(ありません)

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20120130114042
サイトの表紙【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】の表紙【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】のコンテンツ全リスト 【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】の入手全リスト 【『【省エネ対応】 C#プログラムの効率的な書き方 LINQ to Objects マニアックス』読者サポート】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.36 (Alpha-Test) Copyright (c) 2004-2021 Pie Dey.Co.,Ltd.