请帮助我使用Linq重构这段代码。如何只使用Where和ToList一次?Thx求助
private IEnumerable<SomeClass> Filter(IEnumerable<SomeClass> aaa, string name, string company, string address,int? age)
{
var ans = new List<SomeClass>();
if (!String.IsNullOrEmpty(name))
ans = aaa.Where(x => x.name.equal(name)).ToList();
if (!String.IsNullOrEmpty(company))
ans = ans.Where(x => x.company.equal(company)).ToList();
if (!String.IsNullOrEmpty(address))
ans = ans.Where(x => x.address.equal(address)).ToList();
if (age.HasValue)
ans = ans.Where(x => x.age == age.Value).ToList();
return ans;
}发布于 2014-01-07 08:39:44
你可以用这个:
var ans = aaa.Where( x => ( string.IsNullOrEmpty(name)
|| x.name.equal(name)
)
&&
( string.IsNullOrEmpty(company)
|| x.company.equal(company)
)
&&
( string.IsNullOrEmpty(address)
|| x.address.equal(address)
)
&&
( !age.HasValue
|| x.age == age.Value
)
);发布于 2014-01-07 08:42:39
您可以放弃对ToList的所有调用。如果没有这些调用,组合过滤将以一种您不需要关心的延迟方式执行。
如果您确实想影响执行筛选的时间(或者确保结果是基于aaa在调用Filter时的快照,并且以后aaa更改时不会更改),请将最后一行更改为
return ans.ToArray();(这里可能不需要列表;返回的值无论如何都是输入给IEnumerable<SomeClass>的,调用者不应该期望直接修改(添加/删除项)返回的对象。
因此,完整的代码如下所示:
private IEnumerable<SomeClass> Filter(IEnumerable<SomeClass> aaa, string name, string company, string address,int? age)
{
IEnumerable<SomeClass> ans = new SomeClass[0];
if (!String.IsNullOrEmpty(name))
ans = aaa.Where(x => x.name.Equals(name));
if (!String.IsNullOrEmpty(company))
ans = ans.Where(x => x.company.Equals(company));
if (!String.IsNullOrEmpty(address))
ans = ans.Where(x => x.address.Equals(address));
if (age.HasValue)
ans = ans.Where(x => x.age == age.Value);
return ans.ToArray();
}正如其他答案所显示的那样,也可以将所有Where调用合并为一个,尽管坚持原来的if和Where的链非常清楚地显示了它所做的事情,这对于组合解决方案可能不适用。
发布于 2014-01-07 09:01:37
只是想在这里补充另一个答案。为什么要创建一个列表呢?您的输入是一个IEnumerable,所以您的输出是相同的?
private IEnumerable<SomeClass> Filter(IEnumerable<SomeClass> aaa, string name, string company, string address, int? age)
{
if (!String.IsNullOrEmpty(name))
aaa = aaa.Where(x => x.name.Equals(name));
if (!String.IsNullOrEmpty(company))
aaa = aaa.Where(x => x.company.Equals(company));
if (!String.IsNullOrEmpty(address))
aaa = aaa.Where(x => x.address.Equals(address));
if (age.HasValue)
aaa = aaa.Where(x => x.age == age.Value);
return aaa;
}https://stackoverflow.com/questions/20967095
复制相似问题