c#에서 Delegate를 이용해 이 함수를 좀 깔끔하게 뽑아낼 수 없을까요?
조회수 1034회
public static void TrigFunctions_Example(string pathNfilename)
{
FileStream fsWrite = new FileStream(pathNfilename, FileMode.Create, FileAccess.Write);
StreamWriter sWriter = new StreamWriter(fsWrite);
for (double angleDEG = 0.0; angleDEG <= 360.0; angleDEG += 45.0)
{
double angleRAD = ConvertDegreesToRadians(angleDEG);
Console.WriteLine("Angle = {0}\xb0", angleDEG);
sWriter.WriteLine("Angle = {0}\xb0", angleDEG);
Console.WriteLine("Cos({0}\xb0)={1}", angleDEG, Math.Cos(angleRAD));
sWriter.WriteLine("Cos({0}\xb0)={1}", angleDEG, Math.Cos(angleRAD));
Console.WriteLine("Sin({0}\xb0)={1}", angleDEG, Math.Sin(angleRAD));
sWriter.WriteLine("Sin({0}\xb0)={1}", angleDEG, Math.Sin(angleRAD));
Console.WriteLine("Tan({0}\xb0)={1}", angleDEG, Math.Tan(angleRAD));
sWriter.WriteLine("Tan({0}\xb0)={1}", angleDEG, Math.Tan(angleRAD));
Console.WriteLine("Sec({0}\xb0)={1}", angleDEG, Sec(angleRAD));
sWriter.WriteLine("Sec({0}\xb0)={1}", angleDEG, Sec(angleRAD));
Console.WriteLine("Csc({0}\xb0)={1}", angleDEG, Csc(angleRAD));
sWriter.WriteLine("Csc({0}\xb0)={1}", angleDEG, Csc(angleRAD));
Console.WriteLine("Cot({0}\xb0)={1}", angleDEG, Cot(angleRAD));
sWriter.WriteLine("Cot({0}\xb0)={1}", angleDEG, Cot(angleRAD));
}
sWriter.Close();
}
보시다시피 아주 더럽게 생긴 녀석입니다.
얘들을 최대한 간략화 해보려고 하니, Cot나 Sec같은 친구들은 스트링 배열로 만들어 묶어서 처리할 수 있는데, Math.Cot(angleRAD)는 Math.스트링배열원소번호같은 식으로 손댈 수가 없더라구요. 제가 따로 정의한 Cot, Sec, Csc도 당연히 안되구요..
public static string[] trigarr = {"Cos","Sin","Tan","Sec","Csc","Cot"};
public static string[] hyperarr = { "Cosh", "Sinh", "Tanh", "Sech", "Csch", "Coth" };
public static void CalcNWrite(string pathNfilename, string s)
{
FileStream fsWrite = new FileStream(pathNfilename, FileMode.OpenOrCreate, FileAccess.Write);
StreamWriter sWriter = new StreamWriter(fsWrite);
for (double angleDEG = 0.0; angleDEG <= 360.0; angleDEG += 45.0)
{
double angleRAD = ConvertDegreesToRadians(angleDEG);
for (int i = 0; i < 6; i++)
{
Console.WriteLine(trigarr[i] + "({0}\xb0)={1}", angleDEG, trigarr[i](angleRAD)); //이부분 안통함
sWriter.WriteLine(trigarr[i] + "({0}\xb0)={1}", angleDEG, trigarr[i](angleRAD)); //마찬가지..
}
}
sWriter.Close();
}
어떻게 하면 실제 출력하는 함수 안을 깔끔하게 처리할 수 있을까요?
힌트는 델리게이트를 이용하라.. 는 말씀 뿐이시네요 ㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
2 답변
-
이정도 예제면 하실 수 있을 듯 싶은데요.
private delegate double Cal(double arg); private static double ConvertDegreesToRadians(double angle) { return Math.PI * angle / 180.0; } void Main() { Func<string, double, Cal, string> f = (string name, double x, Cal cal) => string.Format("{0}({1}\xb0)={2}", name, x, cal(ConvertDegreesToRadians(x))); string line = f("Sin", 30, Math.Sin); Console.WriteLine(line); } Sin(30°)=0.5
- 감사합니다! 지금 밖이라 시도해 볼 수가 없네요.. 혹시 이후에라도 의문점 생기면 덧글로 질문 드려도될까요? 알 수 없는 사용자 2018.12.4 15:29
- 직접 해보고시고 질문주세요 정영훈 2018.12.4 15:37
-
private delegate double Cal(double arg);
삭제하고 아래와 같이 해도 됩니다.Func<string, double, Func<double, double>, string> f = (string name, double x, Func<double, double> cal) => string.Format("{0}({1}\xb0)={2}", name, x, cal(ConvertDegreesToRadians(x)));
댓글 입력