בקשת עזרה עם קוד בc#
-
יש לי קוד שאמור לבדוק אם טקסט מסויים קיים בתוך רשימה. הבעיה היא שהוא מפספס חלק מהמקרים
using System; using System.Linq; using System.Collections.Generic; using System.Linq; // Check if Properties.Settings.Default.searchBookList is not null and not empty ILookup<string, string> bookNamesFilter; if (!string.IsNullOrEmpty(Properties.Settings.Default.searchBookList)) { // Split the comma-separated string into a lookup of book names bookNamesFilter = Properties.Settings.Default.searchBookList.Split(',') .ToLookup(bookName => bookName); } else { bookNamesFilter = Enumerable.Empty<string>().ToLookup(_ => string.Empty); } // Assuming filePath is a string representing the file path bool containsBook = bookNamesFilter .Any(group => group.Any(bookName => filePath.Contains(group.Key)));
-
@dovid
המטרה של הקוד היא לסנן ספרים שלא נמצאים ברשימת הספרים שב -
Properties.Settings.Default.searchBookList
(זהו חלק מהפרוייקט שלי ליצור תכנת חיפוש בקבצי טקסט ואני רוצה לתת למשתמש לבחור היכן לחפש והיכן לא אז יש לי קוד אחר שנותן למשתמש לבחור איזה ספרים וזה יוצר את הרשימה ושומר אותה בsettings כדי שיהיה זמין גם לפעם הבאה)הקוד עצמו בנוי בצורה כזו:
הרשימה בעצם היא string עם שמות ספרים מופרדים על ידי פסיק
הקוד קורא את הsrting וממיר אותו לרשימה (בהתחלה השתמשתי בlist אבל ראיתי שכותבים ש lookup יותר מהיר)
ואז הוא בודק את המשתנה filePath האם הוא קיים בתוך הרשימה או לא (כך זה נותן אפשרות לסנן כל filepath האם ייכלל בתוך החיפוש או לא)למעשה מה שקורה הוא שמתוך רשימה של נגיד 11 ספרים שיש מתוכם 8 שאמורים לחזור כנכונים הbool מחזיר למעשה רק 4 או חמש נכונים ואני תוהה האם הבעיה בקוד או בפרט אחר בתוכנה.
-
@dovid כתב בבקשת עזרה עם קוד בc#:
למה שלא תיתן קלט ותגיד מה הפלט שאתה רוצה?
הקלט לדוגמא הוא:
filepath = בראשית אור החיים.
Properties.Settings.Default.searchBookList=בראשית עם ניקוד, בראשית רמב"ן
במקרה זה הbool אמור להגיד לי שfilepath לא נמצא ברשימהמשא"כ אם הfilepath היה "בראשית עם ניקוד" או "בראשית רמב"ן"
הbool אמור להגיד לי שהוא כן קיים ברשימהמה שקורה בפועל שהוא מחזיר לי ש"בראשית עם ניקוד" קיים אבל לא "בראשית רמב"ן"
-
@pcinfogmach אתה יכול לאשר שזה קורה רק במחרוזת שמכילה מרכאות?
-
תודה לכל העונים כנראה שהבעיה היא אחרת ממה שחשבתי כי עכשיו עשיתי בדיקה עם linqpad והכל עבד כשורה מצו"ב קוד הבדיקה אשב על זה קצת
static void Main(string[] args) { // Manually define a comma-separated string string searchBookList = "בראשית - עם ניקוד,בראשית - עם טעמים,בראשית - ללא ניקוד,בראשית - רש''י,בראשית - רש''י (ב),בראשית - שפתי חכמים,בראשית - רמב''ן,בראשית - תרגום יונתן,בראשית - אור החיים,בראשית - אבן עזרא,בראשית - בעל הטורים,בראשית - תרגום אונקלוס,בראשית - ספורנו,בראשית - כלי יקר,בראשית - דעת זקנים,מדרש רבה - חומש בראשית,מדרש תנחומא - בראשית,ילקוט שמעוני - בראשית,חק לישראל - בראשית,חק לישראל - בראשית (ט)"; // Replace with your list of book names // Split the comma-separated string into a lookup of book names ILookup<string, string> bookNamesFilter = searchBookList.Split(',') .ToLookup(bookName => bookName); // Assuming filePaths is a list of file paths List<string> filePaths = new List<string> { "בראשית - עם ניקוד", "בראשית - עם טעמים", "בראשית - ללא ניקוד", "בראשית - רש''י", "בראשית - רש''י (ב)", "בראשית - שפתי חכמים", "בראשית - רמב''ן", "בראשית - תרגום יונתן", "בראשית - אור החיים", "בראשית - אבן עזרא", "בראשית - בעל הטורים", "בראשית - תרגום אונקלוס", "בראשית - ספורנו", "בראשית - כלי יקר", "בראשית - דעת זקנים", "מדרש רבה - חומש בראשית", "מדרש תנחומא - בראשית", "ילקוט שמעוני - בראשית", "חק לישראל - בראשית", "חק לישראל - בראשית (ט)", "שמות -עם ניקוד", "שמות -עם טעמים", "שמות - ללא ניקוד", "שמות - רש''י", "שמות - רש''י (ב)", "שמות - שפתי חכמים", "שמות - רמב''ן", "שמות - תרגום יונתן", "שמות - אור החיים", "שמות - אבן עזרא", "שמות - בעל הטורים", "שמות - תרגום אונקלוס", "שמות - ספורנו", "שמות - כלי יקר", "שמות - דעת זקנים", "מדרש רבה - חומש שמות", "מדרש תנחומא - שמות", "ילקוט שמעוני - שמות", "חק לישראל - שמות", "חק לישראל - שמות (ט)", // Add more file paths as needed }; foreach (string filePath in filePaths) { bool containsBook = bookNamesFilter .Any(group => group.Any(bookName => filePath.Contains(group.Key))); if (containsBook) { Console.WriteLine($"File '{filePath}' contains at least one of the book names."); } } }
-
מה פתאום להביא את כל הקוד?? גם ככה הבאת מידי... גם שינית את הקוד משני המקרים וגם יש שמה הרבה הבלים של נסיונות, חבל, למה לא לכתוב פה מה צריך.
אתה לא יכול לומר "יש לי טקסט A ואני רוצה לבדוק אם הוא אחד מהאלמנטים שמופיעים בB עם פסיק ביניהם"?
לפי מה שהבנתי ממך, אתה צריך לכתוב קוד כזה:bool exsist = Properties.Settings.Default.searchBookList.Split(',').Any(x => x == filepath);
Lookup עושה משהו אחר מlist (הוא מקבץ פריטים לפי ערכם או לפי פרמטר נבחר) והוא לא יותר מהר ממנה, ושניהם מיותרים לצורך שלך.
הקוד שלך נראה כמו של אחד שלא שמע על המושג פונקציה/פרוצדורה מימיו, וזה מאוד מקשה עליך לעבוד.
אתה צריך להתרגל לחלק את הקוד לפיסות קטנות, שעל כל פיסה יש תפקיד מוגדר וסגור. את שיתוף המידע בין הפיסות עושים או עם שדות/מאפיינים משותפים במחלקה (OOP). -
הנה קוד עם HashSet:
static void Main(string[] args) { string searchBookList = "בראשית - עם ניקוד,בראשית - עם טעמים,בראשית - ללא ניקוד,בראשית - רש''י,בראשית - רש''י (ב),בראשית - שפתי חכמים,בראשית - רמב''ן,בראשית - תרגום יונתן,בראשית - אור החיים,בראשית - אבן עזרא,בראשית - בעל הטורים,בראשית - תרגום אונקלוס,בראשית - ספורנו,בראשית - כלי יקר,בראשית - דעת זקנים,מדרש רבה - חומש בראשית,מדרש תנחומא - בראשית,ילקוט שמעוני - בראשית,חק לישראל - בראשית,חק לישראל - בראשית (ט)"; // Replace with your list of book names var bookNamesFilter = searchBookList?.Split(',').ToHashSet(); var filePaths = new List<string> { "בראשית - עם ניקוד", "בראשית - עם טעמים", "בראשית - ללא ניקוד", "בראשית - רש''י", "בראשית - רש''י (ב)", "בראשית - שפתי חכמים" }; if(bookNamesFilter != null) foreach (string filePath in filePaths) { if (bookNamesFilter.Contains(filePath)) Console.WriteLine($"File '{filePath}' contains at least one of the book names."); } }
-
@dovid כתב בבקשת עזרה עם קוד בc#:
if (searchBookList.Contains(filePath))
לא הבנתי שורה זו כי כאן חזרת לstring המקורי לכאורה אז היכן אני משתמש בhashset
-
@dovid כתב בבקשת עזרה עם קוד בc#:
הקוד שלך נראה כמו של אחד שלא שמע על המושג פונקציה/פרוצדורה מימיו, וזה מאוד מקשה עליך לעבוד.
אתה צריך להתרגל לחלק את הקוד לפיסות קטנות, שעל כל פיסה יש תפקיד מוגדר וסגור. את שיתוף המידע בין הפיסות עושים או עם שדות/מאפיינים משותפים במחלקה (OOP).תודה על ההערה אני מכיר את המושג פשוט התעצלתי אתה צודק. במאה אחוז.
אגב שאלה האם פיצול קוד ארוך להרבה חלקים עלול להאט את הקוד (כי למעשה עכשיו יש קצת יותר שורות בקוד מאם אילו הכל היה בתוך קוד אחד)