12


2

私はLinqを使い始めたばかりで、BindingListにあるデータを並べ替えたいと思います。 Linqクエリを実行したら、BindingListコレクションを使用してデータをバインドする必要があります。

var orderedList = //これはlinq query return(BindingList)orderedListです。

これはコンパイルされたが実行に失敗しました。トリックは何ですか?

3 Answer


17


新しいBindingList(orderedList.ToList())


3


どのコレクションタイプも他のコレクションにキャストできるとは限りません。 コンパイラーがキャストをチェックする時期に関しては、https://stackoverflow.com/a/4499558/1366033 [Compile-time vs runtime casting]でこの投稿をチェックしてください。

しかし、いくつかの配管を自分で行うことで、列挙型から `BindingList`を簡単に生成することができます。 コレクションをBindingListに変換するために、次のExtension MethodをEnumerable型に追加するだけです。

  • C#*:

static class ExtensionMethods
{
    public static BindingList ToBindingList(this IEnumerable range)
    {
        return new BindingList(range.ToList());
    }
}

//use like this:
var newBindingList = (from i in new[]{1,2,3,4} select i).ToBindingList();
  • VB *:

Module ExtensionMethods
     _
    Public Function ToBindingList(Of T)(ByVal range As IEnumerable(Of T)) As BindingList(Of T)
        Return New BindingList(Of T)(range.ToList())
    End Function
End Module

'use like this:
Dim newBindingList = (From i In {1, 2, 3, 4}).ToBindingList()


2


これは、匿名オブジェクトのインスタンスを作成するselect newではなく、あなたのlinqクエリのselect射影がMyObjectとして明示的に型指定されている場合にのみ有効です。 そのような場合、typeof(orderedList.ToList())はこれと似たようなものになります。System.Collections.Generic.List <<> f__AnonymousType1>

例:これは動作するはずです:

var result =(MyObjectsのxから(wherePredicate(x))new MyObjectを選択します{Prop1 = x.Prop1、Prop2 = x.Prop2})ToList();新しいBindingList(結果)を返します。

これはしません:

var result = db.MyObjectsのxから。ここで(Predicate(x))new {Prop1 = x.Prop1 Prop2 = x.Prop2}を選択します。新しいBindingListを返す(result.ToList())
//creates the error: CS0030 "Cannot convert type 'AnonymousType#1' to 'MyObject'

2番目のケースでは、typeof(result)は次のようになります。System.Collections.Generic.List <<> f__AnonymousType2>(タイプparamsは選択投影法で設定されたプロパティと一致します)

参照:http://blogs.msdn.com/swiss_dpe_team/archive/2008/01/25/using-your-own-defined-type-in​​-a-linq-query-expression.aspx