האם יש דרך לקרוא לאובייקט ללא סוג?
-
למה בכלל צריך את LINQ ?
פשוט תעבור בלולאה על שני הרשימות ותשמור ברשימה שלישית את אלא שעומדים בתנאים
מן הסתם זה יהיה פי מאה יותר מהר מאשר ש- LINQ עושה את זה.במקרים כאלה דוקא LINQ ינצח בקלות לולאה פרימיטבית. JOIN של LINQ משתמש במילון פנימי, ואילו בלולאה פרימטיבית אתה חייב לולאה פנימית שמחפשת כל פעם את האיבר, וזה פי שלוש לרעת הלולאה לפחות. אם תתחכם ותעשה מיון וחיפוש בינארי אזי תנצח, אבל רחוק מאוד מפי מאה (משהו כמו פי 10 וזה דוקא בהתפלגות טובה ובהרבה מאוד איברים).
LINQ בד"כ מועדף בגלל קריאות וקלות תחזוקה. אבל גם בביצועים הוא בסדר ועלותו אם בכלל זניחה.פורסם במקור בפורום CODE613 ב06/09/2015 00:17 (+03:00)
-
דוד תודה רבה על ההרחבה בהסברים!!!
קיבלתי, והוספתי מחלקה שלישית (עשיתי שהיא תירש מאחת מהמחלקות הראשונות, וככה נשאר לי רק להוסיף את המשתנים של המחלקה השניה :lol:
זה בסדר? או שאסור לעשות ככה ?!?!ומה הכוונה שהjoin משתמש במילון פנימי?
פורסם במקור בפורום CODE613 ב06/09/2015 00:30 (+03:00)
-
אם אתה יורש רק כדי לחסוך הקלדה, אז לא עושים כך, אבל אם יש בזה צורך אז תירש למה לא.
@דוד ל.ט.
במקרים כאלה דוקא LINQ ינצח בקלות לולאה פרימיטבית. JOIN של LINQ משתמש במילון פנימי, ואילו בלולאה פרימטיבית אתה חייב לולאה פנימית שמחפשת כל פעם את האיבר, וזה פי שלוש לרעת הלולאה לפחות. אם תתחכם ותעשה מיון וחיפוש בינארי אזי תנצח, אבל רחוק מאוד מפי מאה (משהו כמו פי 10 וזה דוקא בהתפלגות טובה ובהרבה מאוד איברים).
ההגיון אומר שכל דבר שהוא גנארי חייב לבדוק המון בדיקות תקינות, וחייב להיות גמיש וממילא הוא בוודאי הרבה איטי מאשר משהו שנבנה באופן יעודי.
באיזה מילון הוא משתמש? גם אתה יכול להשתמש במילון?פורסם במקור בפורום CODE613 ב06/09/2015 00:57 (+03:00)
-
קיבלתי, והוספתי מחלקה שלישית (עשיתי שהיא תירש מאחת מהמחלקות הראשונות, וככה נשאר לי רק להוסיף את המשתנים של המחלקה השניה :lol:
זה בסדר? או שאסור לעשות ככה ?!?!לא. ירושה זה יותר להרחבה של צורך קיים. פה אתה סתם צריך "מחסן".
אני הייתי יוצר מחלקה שיש לה שתי מאפיינים: תורם ותרומה.
וכעת אני חושב שהכי פשוט זה להשתמש עם מחלקה קיימת, שמה Tuple. שימושה היא ליצור סט של מאפיינים ללא יצירת מחלקה מתאימה. אז ככה:public static ObservableCollection<Tuple<Donor, Donation>> listResult; var newlistDonors = from o in donatFilter join d in AddTorem.donors on o.IdDonor equals d.Id select Tuple.Create(o, d); listResult = new ObservableCollection<Tuple<Donor, Donation>>(newlistDonors);
פורסם במקור בפורום CODE613 ב06/09/2015 10:59 (+03:00)
-
ההגיון אומר שכל דבר שהוא גנארי חייב לבדוק המון בדיקות תקינות, וחייב להיות גמיש וממילא הוא בוודאי הרבה איטי מאשר משהו שנבנה באופן יעודי.
באיזה מילון הוא משתמש? גם אתה יכול להשתמש במילון?אתה צודק בהכל חוץ מהמילה "הרבה". יש ליופי של LINQ תקורה, אבל שולית.
סוג המילון הוא Lookup (ממש דומה לDictionary). אתה יכול כמובן לראות: http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,581.
לא הבנתי מה הכוונה האם גם אני יכול. אגב אם כבר ממשים לבד יש ודאי שיפורים לעשות אבל מבזבזים את הכח והזמן לבנות ייעודית במקומות זניחים לגמרי.פורסם במקור בפורום CODE613 ב06/09/2015 11:09 (+03:00)
-
@דוד ל.ט.
אני הייתי יוצר מחלקה שיש לה שתי מאפיינים: תורם ותרומה.
וכעת אני חושב שהכי פשוט זה להשתמש עם מחלקה קיימת, שמה Tuple. שימושה היא ליצור סט של מאפיינים ללא יצירת מחלקה מתאימה. אז ככה:public static ObservableCollection<Tuple<Donor, Donation>> listResult; var newlistDonors = from o in donatFilter join d in AddTorem.donors on o.IdDonor equals d.Id select Tuple.Create(o, d); listResult = new ObservableCollection<Tuple<Donor, Donation>>(newlistDonors);
טוב, התגברתי על העצלות :lol: וכתבתי מחלקה חדשה לגמרי, ואז ראיתי את ההודעה שלך :lol: :lol:
בכל אופן גם אם אני משתמש במחלקה שלי וגם אם אני משתמש בtuple אני מקבל בשורה האחרונה את הודעת השגיאה הבאה:
אין אפשרות לבצע המרה של אובייקט מסוג '<JoinIterator>d__14[Person.Donation,Person.Donor,System.Int32,System.Tuple
2[Person.Donation,Person.Donor]]' לסוג 'System.Collections.ObjectModel.ObservableCollection1[System.Tuple
2[Person.Donor,Person.Donation]]'.
כשהשתמשתי במחלקה שלי כתבתי select new ואת שם המחלקה, וכבר שם קיבלתי את השגיאה הנ"ל...
מה עושים????? :shock: :shock:
ותודה רבה רבה על כל העזרה!!!!פורסם במקור בפורום CODE613 ב06/09/2015 11:16 (+03:00)
-
טוב, התגברתי על העצלות :lol: וכתבתי מחלקה חדשה לגמרי, ואז ראיתי את ההודעה שלך :lol: :lol:
זה היומיום של מתכנת טוב...
אני מכיר כאלה שלא כותבים שום דבר לחינם, ובגלל זה גם לא יוצא להם שוב דבר טוב.פורסם במקור בפורום CODE613 ב06/09/2015 11:24 (+03:00)
-
@דוד ל.ט.
אתה טועה בבניית הObservableCollection.
תראה איך כתבתי בשורה 6. ותראה איך אתה עשית.כבר שם הוא זרק לי את השגיאה בזמן הכתיבה ולכן ביצעתי המרה מפורשת...
אבל זה לא עזר לי והוא זורק לי את החריג בזמן ריצהפורסם במקור בפורום CODE613 ב06/09/2015 11:26 (+03:00)
-
כתבתי כך:
var newlistDonors = from o in donatFilter join d in AddTorem.donors on o.IdDonor equals d.Id select Tuple.Create(o, d); listResult = new ObservableCollection<Tuple<Donor, Donation>>((ObservableCollection<Tuple<Donor, Donation>>)newlistDonors);
פורסם במקור בפורום CODE613 ב06/09/2015 11:28 (+03:00)
-
טוב, התגברתי על העצלות :lol: וכתבתי מחלקה חדשה לגמרי, ואז ראיתי את ההודעה שלך :lol: :lol:
אני מתנצל שלא שיתפתי אותך בטיפ נוסף פשוט מאוד (אני למדתי להשתמש בו לא מזמן):
אתה משנה את הnew לnew XXX כשהXXX זה שם מחלקה שאתה בוחר שעדיין לא קיימת. כמובן שהשם נצבע באדום. אתה מקיש Ctrl+. בעוד הסמן על המילה. מופיע לך תפריט ואז לחץ אנטר. נוצרת מחלקה חדשה עם כל המאפיינים.. סילחה שהחמצתי מלומר לך זאת בהתחלה.פורסם במקור בפורום CODE613 ב06/09/2015 11:33 (+03:00)
-
@דוד ל.ט.
אתה טועה בבניית הObservableCollection.תראה איך כתבתי בשורה 6. ותראה איך אתה עשית.
כבר שם הוא זרק לי את השגיאה בזמן הכתיבה ולכן ביצעתי המרה מפורשת...
אבל זה לא עזר לי והוא זורק לי את החריג בזמן ריצההObservableCollection מקבל בבנאי אוסף מהסוג הגנרי שלו.
לא צריך לעשות המרה, וגם אי אפשר! ממתי אוסף הוא צאצא של ObservableCollection?! - קאסטינג זה להפוך מחלקה יורשת למחלקה מורישה. כמו לשנות Button של WPF לControl שזה מאבות אבותיו...פורסם במקור בפורום CODE613 ב06/09/2015 11:36 (+03:00)
-
@דוד ל.ט.
אני מתנצל שלא שיתפתי אותך בטיפ נוסף פשוט מאוד (אני למדתי להשתמש בו לא מזמן):
אתה משנה את הnew לnew XXX כשהXXX זה שם מחלקה שאתה בוחר שעדיין לא קיימת. כמובן שהשם נצבע באדום. אתה מקיש Ctrl+. בעוד הסמן על המילה. מופיע לך תפריט ואז לחץ אנטר. נוצרת מחלקה חדשה עם כל המאפיינים.. סילחה שהחמצתי מלומר לך זאת בהתחלה.אין לך מה להתנצל זה ממש ממש חזק!!!
@דוד ל.ט.
הObservableCollection מקבל בבנאי אוסף מהסוג הגנרי שלו.
לא צריך לעשות המרה, וגם אי אפשר! ממתי אוסף הוא צאצא של ObservableCollection?! - קאסטינג זה להפוך מחלקה יורשת למחלקה מורישה. כמו לשנות Button של WPF לControl שזה מאבות אבותיו...החכמתי!! לא חשבתי שהמרה זה דווקא ממוריש ליורש...
בכל אופן בלא המרה הוא זורק לי את אותה השגיאה:
Argument 1: cannot convert from 'System.Collections.Generic.IEnumerable<System.Tuple<Person.Donation, Person.Donor>>' to 'System.Collections.Generic.List<System.Tuple<Person.Donor, Person.Donation>>'
כיצד אפשר להתגבר על כך?
ותודה רבה רבה על כל ההשקעה בעניית התשובות וההסברה!!פורסם במקור בפורום CODE613 ב06/09/2015 15:45 (+03:00)
-
כל פעם שגיאה אחרת... אני לא יודע מה אתה מנסה שם, אבל אנא, קוד כזה עובד? יש שגיאה?
public static ObservableCollection<Tuple<Donor, Donation>> listResult; var newlistDonors = from o in donatFilter join d in AddTorem.donors on o.IdDonor equals d.Id select Tuple.Create(o, d); listResult = new ObservableCollection<Tuple<Donor, Donation>>(newlistDonors);
פורסם במקור בפורום CODE613 ב06/09/2015 16:10 (+03:00)
-
-
זה מוזר.. כי donatFilter זהו ליסט מסוג אובסרבייבל ואין לו בעיה לקבל לתוכו את התוצאות של פונקציית החיפוש שהיא מחזירה ערך מסוג IEnumerable.
אבל עכשיו כשאני משתמש בlinq הוא לא מוכן לקחת את המשתנה שנוצר מסוג IEnumerable ולשים אותו בתוך משתנה מסוג observable..פורסם במקור בפורום CODE613 ב06/09/2015 16:30 (+03:00)
-
זה מוזר.. כי donatFilter זהו ליסט מסוג אובסרבייבל ואין לו בעיה לקבל לתוכו את התוצאות של פונקציית החיפוש שהיא מחזירה ערך מסוג IEnumerable.
לא יכול להיות.
וגם לא הבנתי מה קורה שם אצלך, הקוד שנתתי לך תקין למיטב הבנתי.
ותבין כשאתה עושה משתנה מסוג IEnumerble אתה יכול לשים בפנים כל קולקשן כמעט. אבל להפיך, סוג מסויים של קולקשיין לא יכול לקבל IEnumerble לתוכו.פורסם במקור בפורום CODE613 ב06/09/2015 17:04 (+03:00)
-
@דוד ל.ט.
@avr416
זה מוזר.. כי donatFilter זהו ליסט מסוג אובסרבייבל ואין לו בעיה לקבל לתוכו את התוצאות של פונקציית החיפוש שהיא מחזירה ערך מסוג IEnumerable.לא יכול להיות.
וגם לא הבנתי מה קורה שם אצלך, הקוד שנתתי לך תקין למיטב הבנתי.
ותבין כשאתה עושה משתנה מסוג IEnumerble אתה יכול לשים בפנים כל קולקשן כמעט. אבל להפיך, סוג מסויים של קולקשיין לא יכול לקבל IEnumerble לתוכו.לא יודע מה לומר..
אולי המחשב שלי השתגע, או שאני השתגעתי :shock:
שלחתי לך את הקוד של הפרוייקט בפרטי, אם יש לך כח/זמן/יכולת אשמח אם תציץ בו ותגיד לי מה הבעיה..פורסם במקור בפורום CODE613 ב06/09/2015 20:28 (+03:00)