【问题标题】:how do i refactor these linq properties?我如何重构这些 linq 属性?
【发布时间】:2014-07-07 17:42:00
【问题描述】:

我有 4 个具有相似签名但转到不同 linq 属性的类属性。我如何创建一个委托或其他东西来清理它?

例如:

    public IEnumerable<SelectListItem> DistinctUsers
    {
        get
        {
            var list = TraceLogs.OrderBy(x => x.Username).Select(x => x.Username).Distinct();
            return (from s in list select new SelectListItem { Value = s, Text = s }
           );
        }
    }

    public IEnumerable<SelectListItem> DistinctMethods
    {
        get
        {
            var list = TraceLogs.OrderBy(x => x.Method).Select(x => x.Method).Distinct();
            return (from s in list select new SelectListItem { Value = s, Text = s }
           );
        }
    }

【问题讨论】:

  • TraceLogs的类型是什么?

标签: c# linq refactoring


【解决方案1】:

听起来你想要这样的东西:

private IEnumerable<SelectListItem> GetDistinctOrderedLogs<T>
    (Func<TraceLogs, T> extraction)
{
    return TraceLogs.OrderBy(extraction)
                    .Select(extraction)
                    .Distinct()
                    .Select(s => new SelectListItem { Value = s, Text = s });
}

然后:

public IEnumerable<SelectListItem> DistinctMethods
{
    get { return GetDistinctOrderedLogs(t => t.Method); }
}

public IEnumerable<SelectListItem> DistinctUsers
{
    get { return GetDistinctOrderedLogs(t => t.Users); }
}

【讨论】:

  • 您还可以使用两个泛型参数(接受序列作为参数)使该方法成为泛型,然后简单地执行排序、投影、不同,然后对SelectListItem 进行任何操作序列投影到任何值。这里对TaceLogs 类型没有真正的依赖。
猜你喜欢
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多