1

int パラメーターを受け取り、一連のif...elseステートメントでパラメーターをチェックして文字列を返すメソッドがあります。

if(param == 1)
{
    return "1";
}
else if(param ==20)
{
    return "20";
}
else
{
    if(param <= 10)
    {
        return "below 10";
    }
    else if(param <= 30 )
    {
        return "below 30";
    }
    ...
}

これらの ">= 、 <=" 条件を辞書に入れることは可能でしょうか?

4

5 に答える 5

3

あなたが使用することができますDictionary<Func<int, bool>, string>

    private string Do(int input)
    {
        var dic = new Dictionary<Func<int, bool>, string>
            {
                {param => param == 1, "1"},
                {param => param == 20, "20"},
                {param => param <= 10, "below 10"},
                {param => param <= 30, "blow 30"}
            };

        return dic.First(pair => pair.Key(input)).Value;  
    }

編集:

@Maartenからのコメントは正しいですがDictionary、アイテムの順序を保証するものではありません。この場合は、次ListKeyValuePair場合に最適です。

    private string Do(int input)
    {
        var pairs = new List<KeyValuePair<Func<int, bool>, string>>
            {
                {param => param == 1, "1"},
                {param => param == 20, "20"},
                {param => param <= 10, "below 10"},
                {param => param <= 30, "blow 30"}
            };

        var pair = pairs.FirstOrDefault(pair => pair.Key(input));
        if (pair == null) return string.Empty; // return whatever you want

        return pair.Value;
    }
于 2012-10-02T07:15:52.777 に答える
0

あなたの操作は辞書用にうまく設計されていません。次の2つのケースを考えてみましょう

param == 29 and param ==28

どちらも「30未満」の出力になります。param変数の範囲が大きい場合は、すべての可能性のある値とそれに対応する出力文字列を手動で辞書に入れる必要があります。それは良い考えのようですか?

于 2012-10-02T06:59:07.880 に答える
0

以下疲れました。これに関して問題が発生した場合はお知らせください。

            int testInput = 15;

            Func<int, bool> delegateForCondition1 = param => param == 1;
            var conditionsSet = new HashSet<KeyValuePair<Func<int, bool>, String>> 
                        { 
                          new KeyValuePair<Func<int, bool>, String>(delegateForCondition1, "It is 1"), 
                          new KeyValuePair<Func<int, bool>, String>(param => param <= 10 , "below 10"),
                          new KeyValuePair<Func<int, bool>, String>(param => param <= 30 , "below 30")
                        };


            foreach (KeyValuePair<Func<int, bool>, String> pair in conditionsSet)
            {
                Func<int, bool> currentKeyAsDelegate = pair.Key;
                bool currentResult = pair.Key(testInput);
                Console.WriteLine(currentKeyAsDelegate + "---" + currentResult);
            }

            //Select the first matching condition
            KeyValuePair<Func<int, bool>, String> selectedPair = conditionsSet.FirstOrDefault(p => p.Key(testInput));
            if (selectedPair.Key != null)
            {
                Console.WriteLine(selectedPair.Value);
            }


            Console.ReadLine();
于 2014-01-22T10:20:26.913 に答える
0

たとえば、辞書を使用できます。

擬似コードの例:

var dic = new Dictionary<int,string>{{1,"1"}, {20, "20"}...}

そして長い代わりにif

string value = null; 
dic.TryGetValue(param, out value);
于 2012-10-02T06:49:21.890 に答える
0

いいえ、辞書はそのようには設計されていません。実際に比較条件が多すぎる場合は、比較対象を配列またはリストに入れ、対応する順序で別の配列/リストに値を入れてから、binarysearch を使用してキーのインデックスを見つけ、インデックスを使用して値を取得します。次に例を示します。

    static string find(int val)
    {
        int[] keys = {30,40,50};
        string[] messages = {"Below 30","Below 40","Below 50"};
        int idx = Array.BinarySearch(keys,val);
        if(idx < 0)idx = ~idx;
        return idx < 3 ? messages[idx] : "Off the chart!";
    }

    public static void Main (string[] args)
    {
        Console.WriteLine (find(28));
        Console.WriteLine (find(50));
        Console.WriteLine (find(100));
    }
于 2012-10-02T07:23:20.420 に答える