请考虑以下方法:
private bool DescriptionValid(Membership membership, string identifier)
{
// search for identifier in 4 lists
// only need to find it failing in one
if (membership.premium.Where(ev => ev.Id == identifier).Any())
{
var ev = membership.premium.Where(x => x.Id == identifier).Select(m => m).SingleOrDefault();
if (String.IsNullOrEmpty(ev.Remarks))
{
return false;
}
}
if (membership.club.Where(ev => ev.Id == identifier).Any())
{
var ev = membership.club.Where(x => x.Id == identifier).Select(m => m).SingleOrDefault();
if (String.IsNullOrEmpty(ev.Remarks))
{
return false;
}
}
if (membership.basic.Where(ev => ev.Id == identifier).Any())
{
var ev = membership.basic.Where(x => x.Id == identifier).Select(m => m).SingleOrDefault();
if (String.IsNullOrEmpty(ev.Remarks))
{
return false;
}
}
if (membership.junior.Where(ev => ev.Id == identifier).Any())
{
var ev = membership.junior.Where(x => x.Id == identifier).Select(m => m).SingleOrDefault();
if (String.IsNullOrEmpty(ev.Remarks))
{
return false;
}
}
// no fails
return true;
}
成员资格是一个包含四个列表的属性:
public IList<PremiumMemberShip> premium { get; set; } = new List<PremiumMemberShip>();
public IList<ClubMemberShip> club { get; set; } = new List<ClubMemberShip>();
public IList<BasicMemberShip> basic { get; set; } = new List<BasicMemberShip>();
public IList<JuniorMemberShip> junior { get; set; } = new List<JuniorMemberShip>();
每个成员都是不同的,但是它们具有相似的特征。
有什么办法可以压缩下面的代码?
基本上每次都会测试相同的属性,只是类型针对不同的if
而改变。
感觉应该有一个更好的方法来做到这一点。
答案 0 :(得分:2)
无需更改代码的任何结构,您始终可以这样做:
private bool DescriptionValid(Membership membership, string identifier)
{
var query =
from ms in new []
{
membership.premium.Select(m => new { m.Id, m.Remarks }),
membership.club.Select(m => new { m.Id, m.Remarks }),
membership.basic.Select(m => new { m.Id, m.Remarks }),
membership.junior.Select(m => new { m.Id, m.Remarks }),
}
let ev = ms.Where(x => x.Id == identifier).SingleOrDefault()
where ev != null && String.IsNullOrEmpty(ev.Remarks)
select ev;
return !query.Any();
}
答案 1 :(得分:1)
通常,您可以通过保留通用性并从差异中提取来创建通用代码。创建一个辅助方法:
membership.premium
)成为方法参数。return false;
的返回类型为bool
。PremiumMemberShip
,...)必须向助手公开一个公共的API表面。这可以通过多种方式完成:
Id
和Remarks
成员的接口。dynamic
。Func<T, int> getID, Func<T, string> getRemarks
。否则,helper方法将包含具有相当机械更改的现有代码的副本。