2012-11-26 5 views
12

C#をかなり速く学んでいる間に、私はこのコレクション構文の問題を抱えています。C#listboxコレクションの構文

私はリストボックスlstDataに自分のタイプのMyItemオブジェクトをいくつか追加しました。私は、「使用してSystem.Linqのを含めなかったが、

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

が、リストボックスの項目が.Whereを()がありません。今、私はこのリストボックスと同様にエレガントなLINQ表記を使用しての考えに検索する必要があります; "名前空間。

は、だから私は試してみました:

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

が、これはビルドエラーを与える: 'MySandbox.frmListboxDemo.MyItem' にタイプ 'System.Windows.Forms.ListBox.ObjectCollection' を変換できません。

私が実行可能な何かを書くために管理しなかった:

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

など類似したバージョン:長く2行であることが判明し、「VAR」を置き換えることができるもの把握せずに

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

私はCollections、ObjectCollections、Enumeratorsなどを使用する方法を理解していますが、学習することは熱心です。特に.Where()バージョンが可能であるか、より良いバージョンがある場合。


ご回答ありがとうございます。これは本当に「FORTRAN」の方法よりもはるかに優れている場合、私は(上記参照)知りませんが、それは私が他のC#のクエリで使用できる方法を教示していない

 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; 
     } 

:私はこの解決策になってしまいました。

+0

'.OfType ' ... –

答えて

7

最初にCast<T>を使用して、予想されるタイプへのキャストを実行してみてください。それは次のとおりです。

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

+0

を使用しています。エラーは 'Syst指定されたコンテキストで有効でない 'method'です – Roland

+1

@Roland申し訳ありませんが、私は '()'を呼び出すのを忘れていました。 (私は物事を修正し、@Janが行ったようにさらに追加するつもりでしたが、離れて呼び出された) –

+1

クリス、あなたの助けに感謝します。私はある種の反省の後、自分自身を見つけました。私はこれを働かせる。今私は面白い点のために他のすべてのコメントを読む必要があります。 – Roland

17

項目コレクションが全く厳密に型指定されたコレクションではありません。あなたは、あなたのエントリをフィルタリングすることができますLINQの世界にエントリを取得するためにIEnumerable<T>.OfType()またはIEnumerable<T>.Cast()拡張メソッドを使用することができます。

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

キャストとOfTypeの違いは次のとおりです。

  • OfType<T>はちょうど戻りますタイプTにキャスト可能なアイテム
少なくとも1つのアイテムがTにキャストできない場合、
  • Cast<T>のアイテムは失敗します。
  • +0

    パーフェクトな答え..一つの小さなものですが、OfType-OfTypeの後ろに()の括弧が必要です().Where(... –

    +0

    @JasonHiggins右、私はそれを修正しました – Jan

    1

    ListBox.ObjectCollectionIEnumerableを実装していますが、ほとんどのLinqメソッドが必要とする汎用IEnumerable<T>は実装していません。IEnumerable<T>に取得し、ワンステップであなたの鋳造問題がCast<T>を使用することです解決する

    一つの方法:

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

    項目のうち、リストを作ってみる:

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

    おそらく理由これはもともと.netの以前のバージョンで構築されたものです。