我的数据为 IEnumerable
我正在尝试使用我使用此功能的列表中的任何内容来过滤数据:
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;
}
最终的输出是不断替换循环中的原始数据 我如何将结果附加或添加到最终数据中?
谢谢
这是一个构建过滤器的演示
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" },
},
};
}