0

我正在比较两个相邻列表视图中的项目,并标记相关的项目(在我的列之一上,即产品 ID)。

我的问题是完成此过程所需的时间(几分钟)。我目前使用“finditemwithtext”和重载在子项中包含搜索(我的产品 ID 列在子项(1)上...

我在列表视图 1 中有 12K 项,在列表视图 2 中有 6k 项。

目前我正在“逐步”浏览列表视图 1,并在列表视图 2 中搜索类似项目。

反过来做,逐步通过 2,在 1 中搜索,可能会有相同的性能问题,因为它只逐步通过 6k 个项目,但搜索 12k,与逐步通过 12k,搜索 6k...

也许有更有效的方法来获得最终结果?

当然,要比较的东西太多了... 6000 x 6 列(36000 比较).. 根据我的微薄计算...

谢谢,希望能提供一些意见...

代码:

     Dim tmpListviewItem As New ListViewItem
     Dim c As Int32 = 0


     For Each i As ListViewItem In list1.Items

     If i.SubItems(5).Text = "" Then 'not yet linked item
     tmpListviewItem = list2.FindItemWithText(i.SubItems(1).Text, True, 0, False)

        If tmpListviewItem Is Nothing Then 'nothing found...

        Else 'found corresponding item
           c += 1
           i.SubItems(5).Text = tmpListviewItem.SubItems(1).Text
           tmpListviewItem.SubItems(5).Text = i.SubItems(1).Text
           i.ForeColor = Color.Green
           tmpListviewItem.ForeColor = Color.Green

       End If
     End If
     Next
4

2 回答 2

1

好的,简单地说,我所做的,是这样的:

我构建了一个自定义对象类型的自定义列表,它只存储代码和数量信息(在我的例子中)。数量是我的列表视图中的一列。在查找比较时,我需要它来做一些额外的事情。

1:我在最初加载“更大”列表视图时使用对象构建列表(内存中的纯对象,没有接口绑定)

2:我的两个 lsitviews 都在代码字段上排序

3:我的自定义列表显然也是这样排序的

4:然后我逐步浏览我较小的列表视图,并逐步浏览完整的自定义列表,进行比较。当找到比较时,我退出自定义列表,并从自定义列表中删除该对象,以不断缩小我的列表。

5:由于我对代码字段的排序,在自定义列表中的几百次迭代中总是可以找到对象。

这使我的比较方法从大约 10 分钟缩短到 10 多秒。

    Private Function _find_item_in_rev(itemCode As String) As xStockitem
    Dim myTempItem As New xStockitem
    Debug.Print(currentRevItems.Count.ToString)

    For Each thisItem As xStockitem In currentRevItems

        If thisItem.stockCode = itemCode Then 'found item
            myTempItem.stockCode = itemCode
            myTempItem.price = thisItem.price
            myTempItem.quantity = thisItem.quantity
            currentRevItems.Remove(thisItem)
            Return myTempItem
        End If

    Next
    Return Nothing 'nothing found
End Function
于 2013-02-13T07:29:15.347 回答
0

也许您可以尝试更有效的数据结构。我的 VB.NET 技能很差,但这里有一个简单的 C# 版本。

var dict2 = new Dictionary<string, ListViewItem>();

foreach (ListViewItem item in list2.Items)
{
    dict2.Add(item.SubItems["ProductId"].Text, item);
}

foreach (ListViewItem item in list1.Items)
{
    var productId = item.SubItems["ProductId"].Text;

    ListViewItem item2;
    if (dict2.TryGetValue(productId, out item2))
    {
        // TODO:
        item2.ForeColor = Color.Green;
    }
}
于 2013-01-31T18:02:54.243 回答