簡體   English   中英

C#listbox集合語法

[英]C# listbox Collection syntax

雖然學習C#非常快,但我對這個Collection語法問題感到磕磕絆絆。

我將自己類型MyItem的一些對象添加到listbox lstData。 現在我需要在這個列表框中搜索並想到使用優雅的LINQ表示法,如:

lstData.Items.Where(x => x.Text == SearchString)

但是列表框的項目沒有.Where(),盡管我確實包含了“using System.Linq;” 命名空間。

所以我嘗試過:

foreach (MyItem item in (MyItem)lstData.Items)

但這會產生構建錯誤:無法將類型'System.Windows.Forms.ListBox.ObjectCollection'轉換為'MySandbox.frmListboxDemo.MyItem'。

我確實設法寫了一些可行的東西:

        for (int i = 0; i < lstData.Items.Count; i++)
        {
            MyItem item = (MyItem)lstData.Items[i];
            if (item.Text == SearchString)
            {
                lstData.SetSelected(i, true);
                break;
            }
        }

和類似的版本:

        var item_enum = lstData.Items.GetEnumerator();
        while (item_enum.MoveNext()) { etc etc... }

結果證明是2行更長,並且沒有找出什么可以取代'var'。

我不太確定我是否理解如何使用Collections,ObjectCollections,Enumerators等,但我很想學習。 特別是如果.here()版本是可能的和/或更好的。


謝謝你的所有答案。 我最終得到了這個解決方案:

        var item_iter = lstData.Items.Cast<MyItem>()
                          .Where(x => x.Text.Trim().ToLower() == txtItemName.Text);
        foreach (MyItem item in item_iter)
        {
            int i = lstData.Items.IndexOf(item);
            lstData.SetSelected(i, true);
            break;
        }

我不知道這是否真的比“fortran”方式好(見上文),但它確實教會了我可以在其他C#查詢中使用的方法。

items集合不是強類型集合。 您可以使用IEnumerable<T>.OfType()IEnumerable<T>.Cast()擴展方法來獲取LINQ世界的條目,您可以在其中過濾條目:

var filteredItems = lstData.Items.OfType<MyItem>().Where(i => i.Prop == val);

Cast和OfType之間的區別是:

  • OfType<T>將只返回可轉換為T類的項目
  • 如果集合中至少有一個項目不能轉換為T,則Cast<T>將失敗

首先嘗試使用Cast<T>執行Cast<T>轉換為您期望的類型。 那是:

lstData.Items.Cast<MyItem>().Where(x => x.Text == SearchString)

ListBox.ObjectCollection實現IEnumerable ,但不是大多數Linq方法所需的通用IEnumerable<T>

獲取IEnumerable<T>並一步解決您的轉換問題的一種方法是使用Cast<T>

lstData.Items.Cast<MyItem>().Where(x => x.Text == SearchString)

嘗試從項目中列出一個列表:

(new ListBox()).Items.OfType<ListViewItem>().Where(......); 

可能原因是因為它最初是使用早期版本的.net構建的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM