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

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

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

מתוזמן נעוץ נעול הועבר תכנות
4 פוסטים 2 כותבים 65 צפיות
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #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
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
  • התחברות

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

  • התחברו או הירשמו כדי לחפש.