从对象集合创建字符串

时间:2010-10-04 00:18:04

标签: vb.net string

我有一个问题。我有一类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和redimming数组?

2 个答案:

答案 0 :(得分:4)

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()))

使用.NET 4,您可以放弃ToArray()调用,因为String.Join的重载接受IEnumerable<T>

该代码会过滤掉Sell值为True的汽车。重要的是列表必须按Car.Index的顺序才能正常工作,因此OrderBySelect。确定连续项目的逻辑是比较相邻项目并根据它们的索引差异对它们进行分组。如果差异为1那么他们就是邻居。所以第二个Car投影到一个匿名类型,根据当前索引减去前一个汽车的索引来存储DiffGroupBySelect将所有差异组合在一起。最后Count构建了范围。如果String.Join大于1,我们会在第一个和最后一个组项之间添加一个短划线。否则存在一个项目,我们按原样选择它。最后,我们使用{{1}}返回以逗号分隔的值列表。

答案 1 :(得分:0)

我会这样做:

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))