PDA

View Full Version : سوال: کنترل تکرار اطلاعات در listbox



hrj1981
یک شنبه 22 دی 1398, 13:20 عصر
با درود
دوستان من با کد زیر یکسری نام فایل رو در لیکس باکس فراخوانی میکنم

Me.lstListBox1.Items.AddRange(dlgOpen.FileNames.Se lect(Function(f) IO.Path.GetFullPath(f)).ToArray)
میخواستم بدونم چطوری میتونم با کمک همین کد بگم اگر اسم فایل قبلا تو لیست باکس وجود داشت مجددا اون رو نیاره ؟
ممنون از دوستان

ASHKANLAEI
یک شنبه 22 دی 1398, 16:19 عصر
کد اینلاینش رو نتونستم بنویسم ولی این کد رو ببینین میشه؟
For Each element In dlgOpen.FileNames.Select(Function(f) IO.Path.GetFullPath(f)).ToArray
If Not Me.lstListBox1.Items.Contains(element) Then Me.lstListBox1.Items.Add(element)
Next

the king
یک شنبه 22 دی 1398, 16:27 عصر
با درود
دوستان من با کد زیر یکسری نام فایل رو در لیکس باکس فراخوانی میکنم

Me.lstListBox1.Items.AddRange(dlgOpen.FileNames.Se lect(Function(f) IO.Path.GetFullPath(f)).ToArray)
میخواستم بدونم چطوری میتونم با کمک همین کد بگم اگر اسم فایل قبلا تو لیست باکس وجود داشت مجددا اون رو نیاره ؟
ممنون از دوستان

مثلا اینطوری :

Dim items = Me.lstListBox1.Items.OfType(Of String).ToList()
items.AddRange(dlgOpen.FileNames.Select(Function(f ) IO.Path.GetFullPath(f)))
Me.lstListBox1.Items.Clear()
Me.lstListBox1.Items.AddRange(items.Distinct().ToA rray())

the king
یک شنبه 22 دی 1398, 16:30 عصر
کد اینلاینش رو نتونستم بنویسم ولی این کد رو ببینین میشه؟
For Each element In dlgOpen.FileNames.Select(Function(f) IO.Path.GetFullPath(f)).ToArray
If Me.lstListBox1.Items.Contains(element) Then
Me.lstListBox1.Items.Add(element)
End If
Next

فکر کنم شرط باید If Not باشه، If Not Me.lstListBox1.Items.Contains(element) Then

hrj1981
یک شنبه 22 دی 1398, 18:24 عصر
ممنونم دوستان
من خودم یه جا دیدم از where استفاده کرده اما هرکاری کردم نتونستم به صورت اینلاین بنویسم

the king
یک شنبه 22 دی 1398, 19:24 عصر
ممنونم دوستان
من خودم یه جا دیدم از where استفاده کرده اما هرکاری کردم نتونستم به صورت اینلاین بنویسم
پافشاری روی مختصر مفید نوشتن معمولا کارایی رو فدای مختصر کردن کد میکنه. ظاهر کد بهتر میشه ولی عوضش کندش میکنه.
برای همینه که خود مایکروسافت در کدهای NET Framework. برای تعاریف خود Linq از Linq استفاده کرده ولی عموما برای پیاده سازی سایر موارد از Linq استفاده ای نکرده و کد های طولانی تری رو با تعریف متغیر و حلقه های for و if نوشته. کد های طولانی تر ولی با سرعت اجرای خیلی بالاتر.

Me.lstListBox1.Items.AddRange((From item In dlgOpen.FileNames.Select(Function(f) IO.Path.GetFullPath(f)) Where lstListBox1.Items.Contains(item) = False).ToArray())

ASHKANLAEI
یک شنبه 22 دی 1398, 19:24 عصر
فکر کنم شرط باید If Not باشه، If Not Me.lstListBox1.Items.Contains(element) Then
بله ببخشید حواسم نبود اشتباه نوشتم ویرایشش کردم ببینید درسته؟

hrj1981
یک شنبه 22 دی 1398, 20:04 عصر
بله ببخشید حواسم نبود اشتباه نوشتم ویرایشش کردم ببینید درسته؟
بسیار عالی
بله درست کار میکنه
سپاس گذارم

hrj1981
دوشنبه 23 دی 1398, 22:01 عصر
پافشاری روی مختصر مفید نوشتن معمولا کارایی رو فدای مختصر کردن کد میکنه. ظاهر کد بهتر میشه ولی عوضش کندش میکنه.
برای همینه که خود مایکروسافت در کدهای NET Framework. برای تعاریف خود Linq از Linq استفاده کرده ولی عموما برای پیاده سازی سایر موارد از Linq استفاده ای نکرده و کد های طولانی تری رو با تعریف متغیر و حلقه های for و if نوشته. کد های طولانی تر ولی با سرعت اجرای خیلی بالاتر.

Me.lstListBox1.Items.AddRange((From item In dlgOpen.FileNames.Select(Function(f) IO.Path.GetFullPath(f)) Where lstListBox1.Items.Contains(item) = False).ToArray())

از شما دوست عزیز هم ممنونم بابت راهنمایی
البته بیشتر خودم دوست داشتم یاد بگیرم چجوری میشد از این طریق هم کد رو نوشت که شما زحمت کشیدید.
سپاس گذارم

ASHKANLAEI
سه شنبه 24 دی 1398, 08:58 صبح
پافشاری روی مختصر مفید نوشتن معمولا کارایی رو فدای مختصر کردن کد میکنه. ظاهر کد بهتر میشه ولی عوضش کندش میکنه.
برای همینه که خود مایکروسافت در کدهای NET Framework. برای تعاریف خود Linq از Linq استفاده کرده ولی عموما برای پیاده سازی سایر موارد از Linq استفاده ای نکرده و کد های طولانی تری رو با تعریف متغیر و حلقه های for و if نوشته. کد های طولانی تر ولی با سرعت اجرای خیلی بالاتر.

Me.lstListBox1.Items.AddRange((From item In dlgOpen.FileNames.Select(Function(f) IO.Path.GetFullPath(f)) Where lstListBox1.Items.Contains(item) = False).ToArray())

ببخشید جناب the king، مگه اول عبارت داخل پرانتز انجام نمیشه و بعد آرایه اش به AddRange فرستاده نمیشه؟
فکر میکردم در این صورت نمیشه برای آیتم های قبلی از لیست باکس بررسی کنیم.

the king
سه شنبه 24 دی 1398, 10:02 صبح
ببخشید جناب the king، مگه اول عبارت داخل پرانتز انجام نمیشه و بعد آرایه اش به AddRange فرستاده نمیشه؟
فکر میکردم در این صورت نمیشه برای آیتم های قبلی از لیست باکس بررسی کنیم.
چرا همینطوره. اول محتویاتی که به AddRange میخواد ارسال بشه باید پردازش بشه تا بعد نوبت به AddRange برسه.
اما چیزی که به ما این امکان رو داده که مجموعه رو با محتویات ListBox مقایسه کنیم و فیلتر کنیم اون For In Where ئه که دستش در شرط کاملا باز ئه.
میتونه در Where به هر مجموعه خارجی مثل lstListBox1.Items رجوع کنه و موارد تکراری رو قبل از اینکه با ToArray آرایه ای شکل بگیره و به AddRange ارسالی صورت بگیره فیلتر کنه.

ASHKANLAEI
سه شنبه 24 دی 1398, 11:03 صبح
نه منظورم اینه که چون آرایه بعد کامل شدن یکدفعه به لیست باکس اضافه میشه خب توی where ما داریم توی لیست خالی میگردیم درحالی که باید توی موارد قبلی آرایه بگردیم، نه؟

the king
سه شنبه 24 دی 1398, 12:54 عصر
نه منظورم اینه که چون آرایه بعد کامل شدن یکدفعه به لیست باکس اضافه میشه خب توی where ما داریم توی لیست خالی میگردیم درحالی که باید توی موارد قبلی آرایه بگردیم، نه؟

نه، لیست خالی نبوده. فرضا قبلا file1.txt و file2.txt و file3.txt و file4.txt رو با dlgOpen انتخاب کردن و به لیست اضافه کردن.
حالا دفعه بعدی که file3.txt و file4.txt و file5.txt رو در dlgOpen انتخاب می کنند، فقط file5.txt مورد جدیدی بوده، نمی خوان file3.txt و file4.txt که تکراری هستند دوباره در لیست درج بشه.

ASHKANLAEI
سه شنبه 24 دی 1398, 14:41 عصر
نه، لیست خالی نبوده. فرضا قبلا file1.txt و file2.txt و file3.txt و file4.txt رو با dlgOpen انتخاب کردن و به لیست اضافه کردن.
حالا دفعه بعدی که file3.txt و file4.txt و file5.txt رو در dlgOpen انتخاب می کنند، فقط file5.txt مورد جدیدی بوده، نمی خوان file3.txt و file4.txt که تکراری هستند دوباره در لیست درج بشه.
بله حالا متوجه شدم. ممنون