c#에서 Delegate를 이용해 이 함수를 좀 깔끔하게 뽑아낼 수 없을까요?

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();
    }

어떻게 하면 실제 출력하는 함수 안을 깔끔하게 처리할 수 있을까요?

힌트는 델리게이트를 이용하라.. 는 말씀 뿐이시네요 ㅠ

  • 질문자가 하시려는 것은 리플렉션을 이용해야 합니다. 정영훈 2018.12.4 14:15
  • 앗.. 그러면 리플렉션을 이용하지 않으려면 어쩔 수 없이 라인별로 하나씩 WriteLine해줘야 하나요? Aramath 2018.12.4 15:10
  • WriteLine 을 반복으로 처리하고 싶다는거죠? 정영훈 2018.12.4 15:15
  • 네 저기 WriteLine이 너무 자주 반복되는데, 내용은 사실 거의 차이가 없이 동일해서.. 최대한 단순화해서 가능하면 Console.WriteLine 한줄과 sWriter.WriteLine 한줄을 반복시켜서 처리할 수 있으면 했습니다 Aramath 2018.12.4 15:19

2답변

  • 좋아요

    1

    싫어요
    채택취소하기

    이정도 예제면 하실 수 있을 듯 싶은데요.

    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
    
    • 감사합니다! 지금 밖이라 시도해 볼 수가 없네요.. 혹시 이후에라도 의문점 생기면 덧글로 질문 드려도될까요? Aramath 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)));
    

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.