簡體   English   中英

動態linq表達式,用於使用枚舉集合進行過濾

[英]Dynamic linq expression for filtering with enum collection

public enum StoreType {
    Children = 1,
    Adult = 2,
    Farm = 3
}

如果我有這些的集合:

List<StoreType> enumCollection = new List<StoreType>{ StoreType.Children, StoreType.Farm };

我想構建動態的linq表達式,以便可以遍歷枚舉類型以基於這些枚舉過濾結果?

我想要實現的偽代碼:

var enumFilter = LinqExpressionHelper.BuildEnumFilter(enumCollection);
    _storeRepository.GetStores.Where(enumFilter).ToList();

如何構建動態linq表達式,以便可以按枚舉集合進行過濾?

您可以在列表上執行“ Contains ”:

_storeRepository.GetStores.Where(store => enumCollection.Contains(store.Type)).ToList();

不確定我了解你想要什么

List<StoreType> filters = new List<StoreType> { StoreType.Children, StoreType.Farm };
List<int> lstTofilter = new List<int>() { 1, 2, 3, 4, 5 };
var filteredList = lstTofilter.Where(i => !filters.Any(e => i.Equals((int)e))); //2, 4, 5

記住將枚舉轉換為整數以獲取其值

我認為這是您想要的:

static class Program
{
    private static void Main(string[] args)
    {
        var enumCollection = new List<StoreType> { StoreType.Children, StoreType.Farm };

        var repo = new StoreRepository();

        var enumFilter = LinqExpressionHelper.BuildEnumFilter(enumCollection);
        var result  = repo.GetStores().Where(enumFilter).ToList();

        foreach (var store in result)
            Console.WriteLine($"Name={store.Name}, Type={store.StoreType}");

        Console.ReadKey();
    }
}

public enum StoreType
{
    Children = 1,
    Adult = 2,
    Farm = 3
}

public class StoreRepository
{
    public IEnumerable<Store> GetStores()
    {
        return new List<Store>
        {
            new Store {Name = "NewYork", StoreType = StoreType.Adult},
            new Store {Name = "RioDeJaneiro", StoreType = StoreType.Farm},
            new Store {Name = "Budapest", StoreType = StoreType.Children}
        };
    }
}

public class Store
{
    public string Name { get; set; }
    public StoreType StoreType { get; set; }
}

public static class LinqExpressionHelper
{
    public static Func<Store, bool> BuildEnumFilter(IEnumerable<StoreType> storeTypes)
    {
        return store => storeTypes.Contains(store.StoreType);
    }
}

暫無
暫無

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

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