Orderby C#字符串记录

时间:2019-03-18 00:35:21

标签: c# linq

对于从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;

4 个答案:

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