2013-01-31 47 views
0

我比較兩個相鄰列表視圖中的項目,並標記相關項目(在我的一列中,即產品ID)。比較兩個相鄰列表視圖中的列表視圖項目,並執行相同項目的內容......採取太多loooong

我的問題是他花了很多時間來完成這個過程(幾分鐘)。我目前使用的「finditemwithtext」和重載爲包括子項目searhces(我proiduct ID列是分項(1)...

我在列表視圖1 12K項目,並在列表視圖6K項目2

目前,我正在通過listview 1「步進」,並在listview 2中搜索一個類似的項目。

以相反的方式執行操作,逐步執行2,搜索1,可能會有與其唯一的性能問題相同的性能問題通過6K項目,但搜索12K,通過12K步進,搜索6K ...

也許有一個月重新獲得最終結果的有效方法?

當然,它的東西赫克負荷比較... 6000×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 
+0

在評論方面講,我要嘗試手動迭代thorugh第二列表視圖,並exeting當前的搜索,當我找到一個項目..也只有searhcing的一個子項..但不知道有多少性能會得到......我不確定在「finditemwithtext」方法中會發生什麼...... –

+0

是您在每個列表中唯一搜索的一個子項目嗎?我會使用KeyedCollection並有一個顏色屬性。並將ListViews綁定到KeyedCollection。 – Paparazzi

+0

嗨,好的,必須要對此做一些研究...是的,產品代碼子項目「應該」是獨一無二的......它們直接來源於兩個不同的數據庫......我確信它們是PK 。 –

回答

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 
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; 
    } 
}