我如何减少这些方法中的重复

时间:2019-05-09 07:57:01

标签: c# optimization

请考虑以下方法:

    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而改变。

感觉应该有一个更好的方法来做到这一点。

2 个答案:

答案 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)

通常,您可以通过保留通用性并从差异中提取来创建通用代码。创建一个辅助方法:

  1. 源集合(membership.premium)成为方法参数。
  2. return false;的返回类型为bool
  3. 类(PremiumMemberShip,...)必须向助手公开一个公共的API表面。这可以通过多种方式完成:
    1. 具有IdRemarks成员的接口。
    2. 一个通用的基类。
    3. dynamic
    4. helper方法可以是通用的,并且可以使用函数Func<T, int> getID, Func<T, string> getRemarks

否则,helper方法将包含具有相当机械更改的现有代码的副本。