使用LINQ的通用列表中的值格式化字符串

时间:2011-03-23 18:29:53

标签: c# linq string string-formatting

问题已更新

我有一个通用列表,其中可以包含以下值:

Sector 1
Sector 2
Sector 4

或以下值:

All Sectors

我想在这样的字符串中格式化这个值:

Sector 1 & 2 & 4 - 

All Sectors -

目前,我有以下代码来格式化相同的代码。它有效,但非常复杂。

string retrieveSectors += sectors.Count == 0
                               ? string.Empty
                               : sectors.OrderBy(
                               y =>
                               y.Sector.Substring(
                               y.Sector.Length - 1, 1)).
                               GroupBy(g => g.Sector).Select(
                               g => g.First()).ToList().Aggregate(
                               retrieveSectors,
                               (current, y) =>
                               (current == retrieveSectors
                               ? current +
                               y.Sector
                               : current + " & " +
                               y.Sector.
                               Substring(
                               y.Sector.
                               Length - 1, 1))) + " - "

在上面的代码中,变量扇区是通用列表。有人可以帮助我以简化的方式获得结果。或者可以修改上面的代码,以便更容易理解。

任何帮助表示赞赏。感谢

3 个答案:

答案 0 :(得分:1)

也许更简单一点:

    string retrieveSectors =
        string.Format(
        "sectors {0} -",
        sectors.Select(s => s.Replace("sector ", "").Replace("|", ""))
            .OrderBy(s => s)
            .Aggregate((a, b) => string.Format("{0} & {1}", a, b))
        );

答案 1 :(得分:1)

试试吧!

List<String> list = new List<String>() { "Sector 1", "Sector 2", "Sector 4" };

(list.Count == 0 ? "Not any sector " :    
((list.Contains("All Sectors") ? "All Sectors " :
    "Sector " + String.Join(" & ", list.OrderBy(c => c).ToArray())
        .Replace("Sector", String.Empty)))) + " - "

也适用于:

List<String> list = new List<String>();
List<String> list = new List<String>() { "All Sectors" };

答案 2 :(得分:0)

假设source是存储扇区的任何类型的IEnumerable<string>,可能是更简洁的语法:

String.Join(" & ", source).Replace(" Sector ", " ")

或者,如果source可能是无序的,并且您想要有序的扇区号:

String.Join(" & ", source.OrderBy(s => s)).Replace(" Sector ", " ")

最后,最终改进以检查“没有任何部门”,如Renato的回答:

source.Any() ? String.Join(" & ", source.OrderBy(s => s)).Replace(" Sector ", " ") : "No sectors"

所有这些解决方案无论如何都适用于您最初提到的2个案例(简单来说,后者是增强版本,用于处理可能合理发生且令您感兴趣的附加案例)。