C#使用delegate替换if else代码

时间:2015-10-06 00:40:33

标签: c# delegates

我知道这种方法效果很好。但是我重复使用了大部分代码而且看起来很难看......应该可以使用 委托 <删除 if else / strong>即可。有什么想法吗?

D5  contains  $FFFFFFFF  just  before  the  instruction  MOVE.W  #$F3,D5 
executes. What is the value in D5 after this instruction?

3 个答案:

答案 0 :(得分:1)

没有代表

您的代码可以简单地重构为跟随并从重复中解除:

public IHttpActionResult TimeDatawithUserandServer(string name, string group)
{
    List<Model> res = new List<Model>();
    var groupedData = group.Equals("1") ? FetchServerData(name) : FetchUserData(name);
    res.AddRange(groupedData.Select(item => new Model()
        {
            Count = item.Count(),
            Date = item.Key.EventDate.ToString("yyyy-MM-dd HH:mm:ss"),
            Name = item.Key.Server
        }));
    return Ok(res);
}

private GroupedDataType FetchServerData(string name)
{
     var realName = name.Replace("-", ".");
     var UserData = db.Overalldatas.Where(x => x.Server.Equals(realName));
     return UserData.GroupBy(x => new {x.EventDate, x.User}).ToList();
}

private GroupedDataType FetchUserData(string name)
{
    var Serverdata = db.Overalldatas.Where(x => x.User.Equals(name));
    return Serverdata.GroupBy(x => new {x.EventDate, x.Server}).ToList();
}

请使用上述两种方法和下面的代码中的相应类型替换GroupedDataType

代表

使用Reflection我们找到正确的字段(或属性),然后比较下面代码中的值:

public IHttpActionResult TimeDatawithUserandServer(string name, string group)
{
    List<Model> res = new List<Model>();
    var groupedData = GetGroupedList(group, name);
    res.AddRange(groupedData.Select(item => new Model()
        {
            Count = item.Count(),
            Date = item.Key.EventDate.ToString("yyyy-MM-dd HH:mm:ss"),
            Name = item.Key.Server
        }));
    return Ok(res);
}

private static IEnumerable<GroupedDataType> GetGroupedList(string group, string name)
{
    var filteredList = db.Overalldatas.Where(dbData => Filter(dbData, group, name));
    return filteredList.GroupBy(x => new {x.EventDate, x.User}).ToList();
}

private static readonly Func<ODType, string, string, bool> Filter = (ode, group, name) =>
        {
            var objType = overallDataElement.GetType();
            var field = objType.GetMember(group)[0];
            return (field != null)
                && ((FieldInfo) field).GetValue(ode).ToString().Equals(name);
        };

ODType是Overalldatas列表中元素的类型,ode是overalldata列表的单个元素。

答案 1 :(得分:1)

你可以这样做:

public IHttpActionResult TimeDatawithUserandServer(string name, string group)
{
    var getName = group == "1"
        ? (Func<Overalldata, string>)(od => od.Server)
        : (Func<Overalldata, string>)(od => od.User);

    var realName = group == "1"
        ? name.Replace("-", ".")
        : name;

    var UserData = group == "1"
        ? db.Overalldatas.Where(x => x.Server == realName)
        : db.Overalldatas.Where(x => x.User == realName);

    var groupedData =
        UserData
            .ToArray()
            .GroupBy(x => new { x.EventDate, Name = getName(x) })
            .ToArray();

    var res =
        groupedData
            .Select(item => new Model()
            {
                Count = item.Count(),
                Date = item.Key.EventDate.ToString("yyyy-MM-dd HH:mm:ss"),
                Name = item.Key.Name
            })
            .ToList();

    return Ok(res);
}

答案 2 :(得分:0)

我同意lc提出的意见,他建议通过代码审查来执行此操作。

您的代码中存在一些潜在的反模式

  • group参数是control coupling
  • 的示例
  • 通过if语句使用控制耦合。对我来说,这清楚地表明该方法应该分解为单独的方法。
  • 我还想提请注意Overalldatas系列。它的名字是可疑的,导致其他问题,包括“这个数据对象是否试图做太多?”。但是我不会真的触及这个,因为它与你的问题和我的答案不太相关。

那就是说,我的答案是你应该有两种方法,一种用于“服务器类型”,一种用于“用户类型”。我意识到这推动了其他地方的“小组”检查,但这可以在以后解决,今天你的方法的意图将更加清晰。

p