将过滤器列表应用于 IEnumerable 数据

问题描述 投票:0回答:1

我的数据为 IEnumerable>,过滤器列表为 List>

这就是原始数据

我正在尝试使用我使用此功能的列表中的任何内容来过滤数据:

public IEnumerable<IDictionary<string, object>> OrginalData { get; set; }

public void RunFilter()
{
    List<KeyValuePair<string, object>> list = new List<KeyValuePair<string, object>>();

    list.Add(new KeyValuePair<string, object>("Region", "UK"));
    list.Add(new KeyValuePair<string, object>("Region", "US"));
    
    FilterData(OrginalData, list);
}

private void FilterData(IEnumerable<IDictionary<string, object>> OrginalDataSet, List<KeyValuePair<string, object>> filters)
{
    IEnumerable<IDictionary<string, object>> Inresult = OrginalDataSet;

    foreach (KeyValuePair<string, object> filter in filters)
    {
        Inresult = Inresult.Where(x => (x as Dictionary<string, object>).Values.Any(d => filter.Value.Equals(d)));
    }

    GridData = Inresult;
}

最终的输出是不断替换循环中的原始数据 我如何将结果附加或添加到最终数据中?

谢谢

c# visual-studio linq blazor
1个回答
0
投票

这是一个构建过滤器的演示

Home
页面。我认为您的主要问题在于如何构建查询。

object
是引用对象而不是值对象时,你会遇到问题。

@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

<label>Country</label>
<select class="form-select mb-3" @bind="_selectedCountry" @bind:after="OnSelect">
    <option value="France">France</option>
    <option value="UK">UK</option>
</select>

<label>Nationality</label>
<select class="form-select mb-3" @bind="_selectedNationality" @bind:after="OnSelect">
    <option value="British">British</option>
    <option value="French">French</option>
    <option value="Spanish">Spanish</option>
</select>

@if(_filteredDataSet.Count() == 0)
{
    <div class="m-2">No Matching Results</div>
}
@foreach( var item in _filteredDataSet)
{
<div class="m-2">Name: @item["Name"]</div>    
}



@code {
    private IEnumerable<IDictionary<string, object>> _filteredDataSet = Enumerable.Empty<Dictionary<string, object>>();
    private string _selectedCountry = "UK";
    private string _selectedNationality = "French";

    private void OnSelect()
    {
        this.GetFilters();
    }

    protected override void OnInitialized()
    {
        this.GetFilters();
    }

    private void GetFilters()
    {
        List<KeyValuePair<string, object>> list = new List<KeyValuePair<string, object>>();

        list.Add(new KeyValuePair<string, object>("Country", (object)_selectedCountry));
        list.Add(new KeyValuePair<string, object>("Nationality", _selectedNationality));
        //list.Add(new KeyValuePair<string, object>("Country", "France"));
        //list.Add(new KeyValuePair<string, object>("Nationality", "French"));

        var query = DataSet.AsEnumerable();

        foreach (var filter in list)
            query = query.Where(item => item[filter.Key].Equals(filter.Value));

        _filteredDataSet = query;

    }

    private List<IDictionary<string, object>> DataSet = new List<IDictionary<string, object>>()
    {
         new Dictionary<string, object>() {
            { "Name","David" },
            { "Country","UK" },
            { "Region", "Europe" },
            { "Nationality", "French" },
        },
         new Dictionary<string, object>() {
            { "Name","Fred" },
            { "Country","UK" },
            { "Region", "Europe" },
            { "Nationality", "British" },
        },
         new Dictionary<string, object>() {
            { "Name","Cecile" },
            { "Country","France" },
            { "Region", "Europe" },
            { "Nationality", "French" },
        },
         new Dictionary<string, object>() {
            { "Name","Amelie" },
            { "Country","France" },
            { "Region", "Europe" },
            { "Nationality", "French" },
        },
         new Dictionary<string, object>() {
            { "Name","Manuel" },
            { "Country","France" },
            { "Region", "Europe" },
            { "Nationality", "Spanish" },
        },
    };
}
© www.soinside.com 2019 - 2024. All rights reserved.