对于从db中读取的记录,然后构建一个字符串,我有以下命令。 以下代码可以正常工作,但我知道可以改进此建议,对此建议表示高度赞赏。
result.Sites.ForEach(x =>
{
result.SiteDetails +=
string.Concat(ICMSRepository.Instance.GetSiteInformationById(x.SiteInformationId).SiteCode,
",");
});
//Sort(Orderby) sites by string value NOT by numerical order
result.SiteDetails = result.SiteDetails.Trim(',');
List<string> siteCodes = result.SiteDetails.Split(',').ToList();
var siteCodesOrder = siteCodes.OrderBy(x => x).ToArray();
string siteCodesSorted = string.Join(", ", siteCodesOrder);
result.SiteDetails = siteCodesSorted;
答案 0 :(得分:5)
这有点令人费解,是的。
我们要做的就是选择SiteCode
作为字符串,用OrderBy
排序,然后加入结果。由于String::Join
具有与IEnumerable<string>
一起使用的变体,因此我们不需要在中间转换为数组。
最终我们得到了一个分配给您的SiteDetails
成员的声明:
result.SiteDetails = string.Join(", ",
result.Sites
.Select(x => $"{ICMSRepository.Instance.GetSiteInformationById(x.SiteInformationId).SiteCode}")
.OrderBy(x => x)
);
(或者您可以使用.ToString()
代替$"{...}"
)
这是LINQ中大多数转换的一般过程。弄清楚您的输入是什么,需要使用它们做什么,以及输出应如何显示。
如果您使用的是LINQ,除非您做的很复杂,否则通常必须构建和操作中间列表。对于诸如排序值序列之类的简单任务,几乎没有理由将它们放入过渡集合中,因为该框架会为您处理所有这些事情。
最好的部分是它一次枚举集合以获取完整的数据集。没有更多的循环可以拉出数据,然后进行处理,然后进行重建。
答案 1 :(得分:-1)
要提高性能的一件事是摆脱.ToList()
和.ToString
。两者都不是必需的,只是占用了额外的处理时间和内存。
答案 2 :(得分:-1)
我会使用SortedList,但我认为它不会显着影响性能,可能更容易阅读。
答案 3 :(得分:-1)
使用Corey的答案,这是它的一个变体,但是我想我会提供一种更清晰的表达查询的方式:
result.SiteDetails =
String.Join(", ",
from x in result.Sites
let sc = ICMSRepository.Instance.GetSiteInformationById(x.SiteInformationId).SiteCode
orderby sc
select sc);