בפוסט זה, אני רוצה להביא כמה אופרטורים פחות מוכרים, אבל שימושיים בLINQ, שיכולים להיות בדיוק אלה שיפתרו לכם בעייה מסויימת ומה תפקידם בעולם.
Skip
האופרטור Skip מאפשר לדלק על מספר מסויים של פריטים ב collection, ולהחזיר רק את אלה שלאחר מכן. הנה דוגמאת שימוש:
1: var nums = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2: var results = from p in nums.Skip<int>(3)
3: select p;
4: foreach (var item in results)
5: {
6: Console.WriteLine(item);
7: }
8: Console.Read();
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
בדוגמא הזאת, יודפסו המספרים 4,5,6,7,8 ו-9, כלומר, ישנו דילוג על שלושת הפריטים הראשונים במערך.
Take
למעשה, זה מה שמאפשר את הפעולה ההפוכה. במקום לדלג על הפריטים המסויימים, עם האופרטור הזה נוכל לקחת רק אותם. פשוט, בדוגמא הקודמת שנו את המילה Skip ל- Take.
Concat
האופרטור הזה מאפשר לנו לצרף לאיזשהו אוסף נתונים, אוסף נתונים נוסף מה type שמועבר אליו. למשל:
var nums = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var nums2 = new[] {11,12,13,14};
var results = from p in nums.Concat<int>(nums2)
select p;
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
ה IEnumerable שחוזר, הוא למעשה צירוף של שני הנתונים.
Reverse
למעשה, מדובר בדרך לסדר נתונים מהסוף להתחלה. לא מדובר בסידור לפי הגודל, אלא בסדר הכרונולוגי של הנתונים.
var nums = new[] { 1, 2, 3, 10,4, 5, 6, 7, 8, 9 };
var results = from p in nums.Reverse<int>()
select p;
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
במקרה הזה, הנתונים יוצגו במקום בקריאה משמאל לימין, בקריאה מימים לשמאל.
Distinct
מעיף את כל הכפילויות שיש:
var nums = new[] { 1, 2, 3, 10,4, 5, 6, 7, 8, 9,9 };
var results = from p in nums.Distinct<int>()
select p;
במקרה כזה, הספרה 9 תעובד רק פעם אחת.
Intersect
1: var nums = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
2: var nums2 = new[] {1,6,7,9};
3: var results = from p in nums.Intersect<int>(nums2)
4: select p;
5: foreach (var item in results)
6: {
7: Console.WriteLine(item);
8: }
9: Console.Read();
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
במקרה זה, יודפס החיתוך בין שני המערכים הנתונים, משמע, רק 1,6,7,9. שימוש ב Except היה מדפיס רק את אלה שלא משותפים בין שני המערכים.
Max
מדפיס את הערך המקסימלי במערך:
var nums = new[] { 1,2,3,4,5,6,7,8, 9 };
Console.WriteLine(nums.Max());
עד כאן להפעם!
אחה"צ הזה התקיים מפגש הבלוגרים השלישי לבלוגרים בקהילת blogs.microsoft.co.il (אחד הדיונים, היה, דרך אגב, האם צריך לפתוח את המפגשים האלה לכלל הבלוגרים הטכניים).
המפגשים האלה הם תמיד דרך מעולה להיפגש מחדש עם האנשים השונים, במיוחד הפעם שהיו הרבה חדשים (הקהילה גדלה), לדבר וללמוד.
בין הנושאים שעלו לדיון הפעם זה העתיד של blogs.microsoft.co.il והתכנים שבו, דף(/י) הבית החדש(/ים), פתיחת המפגשים לכלל הבלוגרים בישראל ועוד נושאים שונים (מי אמר טק-אד ולא קיבל?).
בין השאר, יוסי תאגורי גם הציג את המוצר של הסטארט-אפ בו הוא עובד (נוקונומי) ואיך הוא משפר את קבלת הנתונים המחקריים על הרגלי הגולשים באתר (זה כבר לא סטטיסטיקה, מדובר בירידה לפרטים הרבה מעבר לסטטיסטיקה).
גיא בורשטיין הרצה בצורה מעולה על כמה נקודות (חלקן הוא גם הזכיר בסדרת המדריכים שכתב בעבר) הקשורות בכתיבת בלוג (זאת הסיבה שהפעם הפוסט הזה מיושר לימין בRSS, סוף סוף הבנתי את גודל הזוועה) והעביר את הנקודה שהבלוג הוא למעשה כרטיס הביקור הטוב ביותר שלך והסביר כיצד ניתן לקדם אותו, לשפר אותו ולהפוך אותו לטוב יותר וקריא יותר לנוחות הקורא ולטובת בעל הבלוג.
אני חושב שזאת הזדמנות מעולה לברך את כל מי שעוסק במלאכה: ליאור צורף, מיכל גונן, גיא בורשטיין, גיא זרבבסקי, יוסי תאגורי (שהציג את המוצר של החברה שבה הוא עובד) ושאר האנשים ששכחתי שגם להם מגיע להיות ברשימה הזאת.
תודה!
LINQ to SQL זה שמה של טכנולוגיית גישת-הנתונים החדשה של מיקרוסופט. מי שלא מכיר, יכול לצפות ב webcasts שהקלטתי עליה בעבר (1 2). אם צריך לסכם את LINQ to SQL בשלושה מילים, ובהגדרה הכי כללית שאפשר, אלה יהיו קרוב לוודאי Data Access Layer. כלומר, שכבת העבודה עם נתונים של האפליקציה. מעל השכבה הזאת, צריכה לבוא שכבת הלוגיקה העסקית.
לעיתים, באפליקציות שאין הרבה לוגיקה עסקית, עיקר הלוגיקה מהווה למעשה ה DAL. במצב כזה, עיקר הלוגיקה יהיה וואלידציה של הנתונים שנכנסים ויוצאים, ואולי תוספת מועטה של פונקציונאליות.
במצב כזה, הדרך הכי קצרה ליצור שכבת BL, היא פשוט להשתמש ב partial classes. קובץ הקוד של הLINQ TO SQL מכיל מחלקות שמתארות את הטבלאות השונות במסד הנתונים. מחלקות אלו, מוגדרות בכוונה כ partial, קח שניתן יהיה להרחיב אותן מקובץ שונה. כשמרחיבים מקובץ שונה, היתרון המהותי הוא שגם אם אתה הולך ומעדכן את הנתונים באמצעות ה designer ומשנה מחדש את הסכמה של האובייקטים, הדברים שהוספת לא ניזוקים.
זה, בשילוב האפשרות להשתמש ב partial methods שמוגדרות כבר במחלקות המקוריות, נותן את האפשרות להתערב בתהליכים שונים ולקטם אותם, ולהוסיף לוגיקה בקלות.
היתרון בשיטה הזאת שהיא קלה, מהירה ומאד פשוטה כשמדברים על אפליקציות שלא מלאות בלוגיקה.
בהצלחה.
הטרנד העכשווי בישראל, זה שחברות מפרסמות את עצמן באמצעות מספרי 1-800 עם מילים. מה שבארה"ב ובאירופה קיים כבר שנים ומשמש חברות ומשתמשים לזכור מספרים בקלות, בישראל רק עכשיו מתחיל להיכנס. אחד-שמונהמאות-תפילין. אחד-שמונהמאות-משכנתאות וכו'.
בהתחלה, כל הפרסומות אמרו "חייגו במילים" ואז את המספר. עכשיו, בשבוע האחרון, ראיתי שהוסיפו בתחתית הפרסומות את המספר בצורה נומרית ולא מילולית, ואף בחלק גם יש הסבר מה זה אומר (לחיצה אחת על המספר עם האות המבוקשת).
מסתבר, שכנראה הקהל הישראלי לא מבין מה רוצים ממנו עכשיו כשמבקשים ממנו לחייג במילים. כשהוא מתקשר מטלפון נייח לא תמיד יש לו אותיות על המכשיר הטלפון, ולא תמיד עבריות - ולכן לא תמיד הוא יודע על מה ללחוץ, ובכלל, באופן כללי, תחושה של "מה רוצים מאיתנו?".
אבל, החברות השונות ממשיכות במאמציהם לחנך את הציבור, ולא מרפות ומוסיפות כתוביות הסבר כדי להסביר למשתמשים איך לחייג.
למה זה טוב? האם זה באמת עוזר? האם זה בעצם רק מסבך? הקהל ישפוט.
כתבתי סקריפט קצר לגיבוי של Site Collection ב SPS, וכתיבת קובץ לוג שמתעד את פעולות הגיבוי. ניתן להוריד את הסקריפט מכאן, לשנות את הסיומת ל ps1 ולהריץ. דוגמת שימוש:
c:\backup.ps1 -SiteCollectionUrl "http://web:2020" -Path c:\backups
בהצלחה.
ליד שם הסרטון, youtube מציג איזושהי צלמית, שנלקחת באופן קבוע מאמצע הסרטון. הצלמית הזאת, מופיע ליד שם הסרטון בתוצאות החיפוש, בחיפוש ב channels השונים וכו'.
הייתי מצפה, שחברות ואנשים פרטיים ישתמשו בזה להעברת מסרים. נניח, שסרטון פרסומת מטעם איזשהו גוף, יוודא שבדיוק באמצע הקליפ, אפילו לפריים אחד, יופיע הלוגו שלו, מה שיהיה כמעט בלתי גלוי לצופה, אבל יכול לעזור לפרסום של אותו הגוף.
בנוסף לכך, youtube כידוע משמש פלטפורמה שבה יוצרים יכולים לפרסם את השירים שלהם. החל מאנשים שמסריטים את עצמם לצליליו של שיר מפורסם, ועד אנשים שבוחרים ליצור שירים על בסיס שירים קיימים. בחברה הדתית, קיימת האופנה הזאת של לקחת שירי חול, ולהפכם לשירי קודש, או שירים בהקשר של הדת. לעיתים, שירים אלה גם משולבים בתפילות. בבתי כנסת של חסידויות מסויימות, במיוחד באירועים חגיגיים, תוכל למצוא את עצמך מתפלל במנגנינות של להיטי פופ ורוק. זה לנוכח ההיתר שנתנו רבני כל הקהילות כמעט שמתירים שימוש במוזיקה של שיר, גם אם הוא שיר חול, ולתפור עליה מילות קודש.
בעבר, זה היה מתבצע ע"י קבוצות של אמנים שבין השאר היו מבצעים את זה. כיום, גם "סתם" אנשים יכולים באמצעות מצלמה ביתית, חברים, כושר המצאה ו youtube לעשות את זה.
מכירים את "רוצה בנות"? תכירו את "רוצה מצוות". שיר שנראה בהפקה ביתית לחלוטין. דרך אגב, את שורת המחץ מהשיר המקורי, החליף "מזל שאלוהים ברא גם חילונים" בהקשר של מציאת מניים לתפילה.
אפשר להגיד, שגם במקרה הזה, youtube נתן פלטפורמה ליצירתיות של אנשים (בכוונה משתמש במילה יצירתיות, ולאו דווקא כישרון).
חוץ מזה, שבאופן קבוע כשיש שיר שאני רוצה לשמוע, ולא נמצא אצלי, אני פשוט מחפש את השם שלו ביוטיוב. בד"כ גם מוצא.