質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

5回答

32625閲覧

[C#]関数を配列でまとめたい

hn_tokyo

総合スコア69

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2015/12/21 03:29

関数を配列でまとめて、それをindexで呼び出すみたいなことをしたいのですが、

関数を配列にまとめるにはどうしたらよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

こんにちは。

こんなですかね。
ただ、引数やリターン値を統一するか、何かでラップするか(xxxArgsみたいな)が必要ですね。

C#

1static void Main(string[] args) 2{ 3 List<Func<int, int, int>> hoge = new List<Func<int, int, int>>(); 4 hoge.Add((a, b) => 5 { 6 return a + b; 7 }); 8 hoge.Add((a, b) => 9 { 10 return a - b; 11 }); 12 hoge.Add((a, b) => 13 { 14 return a * b; 15 }); 16 17 var piyo = hoge[2](2, 4); 18 Console.WriteLine(piyo); 19 Console.Read(); 20}

投稿2015/12/21 03:36

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

例えばこんな感じででどうでしょう?
bool result = JumpTest.Execute(1, 2, 3);
みたいな感じでの使い方を想定してみました。

c#

1public class JumpTest { 2 private delegate bool funcDelegate(int arg1, int arg2); 3 private static funcDelegate[] funcTables = { 4 test000, 5 test001, 6 test002, 7 }; 8 private static bool test000(int arg1, int arg2) { 9 return true; 10 } 11 private static bool test001(int arg1, int arg2) { 12 return true; 13 } 14 private static bool test002(int arg1, int arg2) { 15 return true; 16 } 17 public static bool Execute(int index, int arg1, int arg2) { 18 if (((index >= 0) && (index < funcTables.Length)) { 19 funcDelegate func = funcTables[index]; 20 if(func != null) { 21 return func(arg1, arg2); 22 } 23 } 24 return false; 25 } 26} 27

投稿2016/07/19 08:44

HiroshiWatanabe

総合スコア2160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

関数をクラスのメソッドにして、インスタンス配列にしてforで回したら。

投稿2016/01/01 07:45

doron

総合スコア152

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語の関数ポインタ配列,C#のdelegateを使えば達成できますが,いずれも引数の型が揃っている必要があります.

c

1#include <stdio.h> 2int fn1(int arg1, int arg2) 3{ 4 return arg1 + arg2; 5} 6int fn2(int arg1, int arg2) 7{ 8 return arg1 * arg2; 9} 10int main(int argc, char *argv[]) 11{ 12 int (*test[2])(int, int); 13 int i; 14 test[0] = fn1; 15 test[1] = fn2; 16 for (i = 0; i < 2; i++) { 17 printf("fn%d(%d,%d) = %d\n", i+1, 3, 4, test[i](3, 4)); 18 } 19 return 0; 20}

delegateはdelegateで宣言したインスタンスにメソッドを追加し,メソッドを実行すると全ての登録されたメソッドに同じ引数で呼び出します.
引数の型や個数が異なる場合は,64ビット環境であれば全て64ビットのunsigned long型で引数の最大個数分用意しておいて,ポインタのキャストによってごまかす方法があります.
こういったことがやりやすいのは,Cの良さだと思います.

c

1#include <stdio.h> 2struct xy { 3 int x; 4 int y; 5}; 6int fn1(unsigned long arg1, unsigned long unused) 7{ 8 struct xy *p = (struct xy *)arg1; 9 return p->x + p->y; 10} 11int fn2(unsigned long arg1, unsigned long arg2) 12{ 13 return *(int*)arg1 * *(int*)arg2; 14} 15int main(int argc, char *argv[]) 16{ 17 int i; 18 struct fn_arg { 19 int (*fn)(unsigned long, unsigned long); 20 unsigned long arg1; 21 unsigned long arg2; 22 } test[2]; 23 struct xy tmp; 24 tmp.x = 3; 25 tmp.y = 4; 26 27 test[0].fn = fn1; 28 test[0].arg1 = (unsigned long)&tmp; 29 test[0].arg2 = 0; 30 31 test[1].fn = fn2; 32 test[1].arg1 = (unsigned long)&tmp.x; 33 test[1].arg2 = (unsigned long)&tmp.y; 34 35 for (i = 0; i < 2; i++) { 36 printf("fn%d = %d\n", i+1, test[i].fn(test[i].arg1, test[i].arg2)); 37 } 38 return 0; 39}

慣れているのがCなので,こちらで書いてしまいました.
C#への変更はご自分でお願いします.

投稿2015/12/21 04:21

編集2015/12/21 04:22
KenTerada

総合スコア751

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。

C#で関数自体をハンドリングする時はデリゲートって理解してます。
「C# デリゲート 配列」で検索すると、ここがでてきました。これを参考にすれば直ぐにできると思います。

既にTak1waさんがラムダ式による解を回答されてますね。
用途に応じて使い分けるとよいと思います。

投稿2015/12/21 04:06

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問