דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. איך לפרק אקספרשן

איך לפרק אקספרשן

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 2 כותבים 119 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #1

    יש לצורך העניין פונקציה כזאת:

    public  IEnumerable<MyClass> Find(Expression<Func<MyClass, bool>> predicate )
            {
              // מה שלחו לי כאן? איזה פרופרטיז? אילו אופרטורים??
            }
    

    תודה.

    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

    dovidD תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לארכיטקט ב נערך לאחרונה על ידי
      #2

      בפוקנציה שהבאת יש ארגומנט אחד בשם predicate.
      הוא מכיל Expression<Func<MyClass, bool>> שזה ביטוי מסוג פונקציה שמקבלת ארגומנט בודד של MyClass ומחזירה bool.
      מה אתה יכול לעשות איתו? לקמפל אותו לפונקציה ולהפעיל אותה, למשל ככה:

      List<MyClass> listMyClass = new List<MyClass> {
      	new MyClass { Name = "אני" },
      	new MyClass { Name = "אתה" },
      	new MyClass { Name = "והוא" }
      }
      
      public IEnumerable<MyClass> Find(Expression<Func<MyClass, bool>> predicate)
      {
      	var methodToExecute = predicate.Compile();
      	foreach (var element in listMyClass)
      	{
      		if (methodToExecute(element))
      			Console.WriteLine("element true for condition");
      		else
      			Console.WriteLine("element false for condition");
      	}
      	return null;
      }
      

      איך יוצרים Expression<Func<MyClass, bool>>? מציבים בו ביטוי למבדה מתאים, למשל:

      Find(x => x.Name.StartsWith("א"));
      
      Expression<Func<MyClass, bool>> pred = x => x.Name.Length > 2;
      Find(pred);
      

      עם הExpression אפשר לבנות ביטויים מורכבים כמו עץ. לקבל למשל שתי ביטויים ולהפוך אותם לאחד של And וכו'.

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      2
      • א מנותק
        א מנותק
        ארכיטקט
        כתב ב נערך לאחרונה על ידי
        #3

        השאלה שלי לא הובנה, אני משתמש כבר שנים בפילטור כפי שהראית.
        אני רוצה לדעת מה כתוב בתוך האקפסרשן, כלומר אני צריך לחשוף את התוכן של הביטוי. ולומר לדוגמא:

        (if (predicate.Contains "Name==david"
        throw new NotImplement....
        

        אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

        תגובה 1 תגובה אחרונה
        0
        • dovidD מנותק
          dovidD מנותק
          dovid ניהול
          כתב ב נערך לאחרונה על ידי dovid
          #4

          כן. אפשר לקבל את זה כמחרוזת ע"י ToString וגם אפשר לפרק את זה לאובייקטים:

          var exp = x => x.Name.Contains("");
          
          Console.WriteLine(exp.ToString()); // x => (x.Name.Contains(""))
          
          var func = exp.Body;
          
          Console.WriteLine(func.ToString()); //  ( x.Name.Contains(""))
          
          Console.WriteLine(func.Type == typeof(bool)); //true - returned type
          
          //body node type. true for x.Contains("xx"). 
          //other: https://docs.microsoft.com/en-us/dotnet/api/system.linq.expressions.expressiontype?view=netcore-3.1
          Console.WriteLine(func.NodeType == ExpressionType.Call); 
          
          //check if the Node is a MethodCallExpression.
          if(func is MethodCallExpression funcAsMethod)
          	Console.WriteLine( funcAsMethod.Method.Name); // Contains for x.Contains("y")
          

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          2

          בא תתחבר לדף היומי!
          • התחברות

          • אין לך חשבון עדיין? הרשמה

          • התחברו או הירשמו כדי לחפש.
          • פוסט ראשון
            פוסט אחרון
          0
          • דף הבית
          • קטגוריות
          • פוסטים אחרונים
          • משתמשים
          • חיפוש
          • חוקי הפורום