如何重构C#linq代码? [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何重构C#linq代码? [关闭]相关的知识,希望对你有一定的参考价值。

我创建了一个使用LinqToSql的控制台应用程序。它工作得很好,但我觉得它是一种代码味道。这是我的linq查询:

var personnelInfo = Personnels.Where(p => p.Name.Equals("Steve Jobs"));

现在,我想报告该对象的各个字段。这就是我觉得代码味道:

Console.WriteLine(String.Format("Emp ID = {0}", personnelInfo.Select(p => p.EmpID).FirstOrDefault()));
Console.WriteLine(String.Format("Phone# = ({0}) {1}-{2}", 
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(0,3),
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(3,3),
    personnelInfo.Select(p => p.Phone).FirstOrDefault().Substring(6,4)));
Console.WriteLine(String.Format("City = {0}", personnelInfo.Select(p => p.City).FirstOrDefault()));

这可以重构吗?

答案

您应该只获取一次查询结果:

var firstPerson = personnelInfo.First();

然后,您可以直接访问属性。

您还应将电话号码格式移动到单独的可重复使用功能中。

另一答案

我会建议一个foreach,因为那里可能还有另一个史蒂夫乔布斯:

foreach(var personel in personelInfo)
{
    Console.WriteLine(String.Format("Emp ID = {0}", personel.EmpID));
    Console.WriteLine(String.Format("Phone# = ({0}) {1}-{2}", 
        personel.Phone.Substring(0,3),
        personel.Phone.Substring(3,3),
        personel.Phone.FirstOrDefault().Substring(6,4)));
    Console.WriteLine(String.Format("City = {0}", personel.City));
}

以上是关于如何重构C#linq代码? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何重构这个 Java 代码片段

重构代码以不使用绝对路径或 URI [关闭]

为 Blogger 上的博客格式化代码片段 [关闭]

Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]

我该如何做模态对话框片段(代码在我关闭之前不会执行)

将我的 DAL 代码重构为领域驱动设计或更现代的设计 (C# 3.5)?