1

渡したラムダ式に基づいてアイテムのフィルターされたリストを取得する関数があります。以下は、私が行っていることの例です。リストはmyBaseのObservableCollectionであり、渡すフィルターは次のようになります。t => t.Data.Any()

現時点では、「filter」を上記のラムダに置き換えると機能しますが、それを渡してローカル変数filterを使用すると、「使用法から推測できません」などのコンパイルエラーが発生します。型引数を明示的に指定してみてください。」</p>

    protected IEnumerable<myBase> GetByFilter(Expression<Func<myBase, bool>> filter)
    {
        IEnumerable<myBase> itemlList = _items.Where(filter).ToList();
        return itemlList ;
    }

ここで何が欠けていますか?

編集 - - - - - - - - - -

渡されたラムダに基づいて元のリストのサブセットを取得しようとしています。可能であれば、IEnumerableではなく別のobservableCollectionを返すラムダ行を回避できる可能性がありますか?

編集 - - - - - - - - - -

Ruslanの助けを借りて、私は自分の問題を修正しました。私のコードはコンパイルされ、次のようになります。

protected IEnumerable<myBase> GetByFilter(Func<myBase, bool> filter) 
{ 
    IEnumerable<myBase> itemlList = _items.Where(filter).ToList(); 
    return itemlList ; 
} 

「t=>t.Data.Any()」のようなフィルターを渡して、すべてのアイテムなどを取得できます。フィルターパラメーターから「Expression」を削除する必要がありました。

4

2 に答える 2

2

この例が、Queryable拡張機能「Where」をEnumerableコレクションに適用してコンパイルする方法がわかりません。そして、それがどのように使用されているかについてはまだ完全には明らかではありません。ただし、以下はコンパイルおよび実行されます。

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace TestProject
{
    class myBase
    {
        public int Id;
        public string Data;
    }

    class Program
    {
        static ObservableCollection<myBase> _items;

        static IEnumerable<myBase> GetByFilter(Func<myBase, bool> filter)
        {
            IEnumerable<myBase> itemlList = _items.Where(filter).ToList();
            return itemlList;
        }

        static void Main(string[] args)
        {
            _items = new ObservableCollection<myBase> { 
                new myBase { Id = 1, Data = "" },
                new myBase { Id = 2, Data = "Data" },
                new myBase { Id = 3, Data = "More Data" }
            };

            IEnumerable<myBase> filteredList = GetByFilter(t => t.Data.Any());

            foreach (var item in filteredList)
                Console.WriteLine("{0}: {1}", item.Id, item.Data);
        }
    }
}

結果:

2: Data
3: More Data
于 2012-06-28T18:35:54.393 に答える
0

問題は、フィルターのタイプがであるように見えExpression<Func<IdcBase, bool>>ますが、(コメントに基づいて)コレクションのWhereメソッドはを必要とします。 _itemsFunc<myBase, bool>

MyBaseとの関係はわかりませんが、から継承しているとIdcBase思います。IdcBaseMyBase

上記の仮定が正しければ、タイプではないエントリが含まれる可能性があるため、MyBaseを期待するフィルタを使用してリストをフィルタリングすることはできません。タイプの入力を期待するフィルターを提供するか、最初にタイプのフィルターに制限する必要があります。IdcBase_itemsIdcBaseMyBase_itemsIdcBase

protected IEnumerable<myBase> GetByFilter(Expression<Func<IdcBase, bool>> filter)
{
    IEnumerable<myBase> itemlList = _items.OfType<IdcBase>().Where(filter).ToList();
    return itemlList ;
}
于 2012-06-28T15:26:41.227 に答える