代码之家  ›  专栏  ›  技术社区  ›  Stan

从对象集合创建字符串

  •  2
  • Stan  · 技术社区  · 14 年前

    Cars 我需要在一个简单的字符串中显示,如果他们将出售或不基于他们的数字。

    就像这样:

    Public Class Car
        Property Index As Integer
        Property Sell As Boolean
    End Class
    Public Class Cars
        Property Vehicles As New List(Of Car) From {
                        {New Car With {.Index = 1, .Sell = True}},
                        {New Car With {.Index = 2, .Sell = False}},
                        {New Car With {.Index = 3, .Sell = True}},
                        {New Car With {.Index = 4, .Sell = True}},
                        {New Car With {.Index = 5, .Sell = True}},
                        {New Car With {.Index = 6, .Sell = False}},
                        {New Car With {.Index = 7, .Sell = True}},
                        {New Car With {.Index = 8, .Sell = True}},
                        {New Car With {.Index = 9, .Sell = False}},
                        {New Car With {.Index = 10, .Sell = False}},
                        {New Car With {.Index = 11, .Sell = True}}}
    End Class
    

    我想显示这样一个简单的字符串: 待售汽车:1、3-5、7-8、11 .Sell 价值观。

    在.NET中创建这种字符串是有某种启发式的方法,还是仅仅是一堆for/each和if/then以及重新命名的数组?

    2 回复  |  直到 14 年前
        1
  •  4
  •   Ahmad Mageed    14 年前

    LINQ肯定会简化解决方案。如果没有LINQ你可以用 StringBuilder

    以下是LINQ解决方案:

    Dim query = vehicles.Where(Function(c) c.Sell) _
                        .OrderBy(Function(c) c.Index) _
                        .Select(Function(c, i) New With { .Car = c, .Diff = c.Index - vehicles(i).Index }) _
                        .GroupBy(Function(item) item.Diff) _
                        .Select(Function(item) item.First().Car.Index.ToString() &
                            If(item.Count() > 1, "-" & item.Last().Car.Index.ToString(), ""))
    
    Console.WriteLine("Cars to be sold: " & String.Join(", ", query.ToArray()))
    

    ToArray() 打电话自 String.Join 具有接受 IEnumerable<T>

    这个代码过滤掉了带有 Sell 的价值 True . 重要的是名单要按顺序排列 Car.Index 为了让它正常工作 OrderBy . 确定连续项的逻辑是比较相邻项并根据它们的索引差异对它们进行分组。如果相差1,他们就是邻居。所以第二个 Select 投影到存储 Car Diff 基于当前指数减去前一辆车的指数。这个 GroupBy 选择 建立范围。如果 Count 大于1时,我们在第一组项目和最后一组项目之间加了一个破折号。否则,一个项目存在,我们选择它,因为它是。最后我们使用 字符串。连接 返回以逗号分隔的值列表。

        2
  •  0
  •   Ahmad Mageed    14 年前

    我会这样做:

    Dim list_sold = Vehicles.Where(Function(x As Car) x.Sell = True)
    Dim list_index = list_sold.Select(Function(x As Car) x.Index.ToString())
    
    Console.WriteLine("Cars to be sold: {0}", String.Join(", ", list_index))