2013-07-21 149 views
1

我有一個真正的問題迭代list<list<object>>,並想問任何人的洞察力。如何索引嵌套列表?

http://i44.tinypic.com/wlqcfn.jpg

,你可以看到我有一個list<list<object>> posCheckOptions含有32所列出,並且每個列表中包含對象的x量,即348 0,325 1等

例如,在該列表348有重複的元素,我想刪除。一式兩份我的意思是,股票的名稱可以是相同的,所以如果我說VODAFONE 4次,我想從每個股票添加數量到第一次發現沃達豐並刪除重複。

for(int k = 0; k<posCheckOptions.Count; k++) 
{ 

int l = 0; 
int m = 1; 

while (l != m) 
{ 


    foreach(var x in posCheckOptions[k][l].name) 
    { 

     if(posCheckOptions[k][l].date != posCheckOptions[k][m].date 
      && posCheckOptions[k][l].strike != posCheckOptions[k][m].strike 
      && posCheckOptions[k][l].callPut != posCheckOptions[k][m].callPut) 

       { 
        m++; 
       } 

       else 
       { 

      posCheckOptions[k][l].size = posCheckOptions[k][l].size + posheckOptions[k][m].size; 

           posCheckOptions[k].RemoveAt(m); 

           m--; 

       } 



       } 

        l++; m = l; 
    } 
} 

什麼我想要的代碼,以及至少想法是,我從posCheckOptions開始[0] [0],比較元素posCheckOptions[0][0].dateposCheckOptions[0][1].date(我比較4場)(poscheckOptions是衛生組織類型的列表T是一個有76個變量的類)。如果我比較的是不相同的(即不重複,我將索引向上移動並繼續下一步,等等。在我的旅行中,如果我找到重複的元素,則執行添加並移除,將索引移回並開始直到我到達結尾

即時通訊與事實混淆,即時通訊不知道如果我需要在j posCheckOptions[0][j]運行2索引,因爲j只有去j + 1有一次說索引m已環繞所有348元素。是348,如果我刪除2 ....

任何建議是真的歡迎:-)

+2

你需要避免在一個列表或在所有列表重複? –

+0

目前還不清楚你認爲是重複的東西。請詳細說明您擁有的數據和您期望的輸出。 – vines

+0

覆蓋所有列表。所以,虐待所有列表(32是股票數量),每個股票包含很多可以顯示爲25,100的期權頭寸,我想將100加到25,然後刪除100。 ... – Timujin

回答

0

我建議做到以下幾點:

  1. IComparable接口實現爲列表中的對象所屬的類型。這樣您可以將比較邏輯存儲在類型本身中。
  2. 創建此類型的列表(就像posCheckOptions中的列表)。讓我們把它叫做bigList
  3. iterarte在所有列出posCheckOptions
  4. 迭代的每個項目中所包含的列表,並檢查項目包含在bigList。如果是,請將其從當前內部列表中刪除。如果沒有添加到bigList
-1

我對包含您的股票信息的類型做了一些假設,隨時根據需要進行調整。你可以做的是創建一個字典映射股票名稱股票對象。如果它存在,請更新字典中的對象,或者將其添加到字典中。

var allStock = mylist.SelectMany(l => l.Select(inner => inner)); 
var lookup = new Dictionary<string, Stock>(); 
foreach (var stock in allStock) 
{ 
    if (!lookup.ContainsKey(stock.Name)) { 
     lookup.Add(stock.Name, stock); 
     continue; 
    } 
    lookup[stock.Name].Quantity += stock.Quantity; 
} 

現在你有一個字典映射股票名稱到實際股票。只需迭代這些值就可以返回列表,如果這是您需要的。

+0

爲什麼downvote?反饋讚賞,如果這是錯誤的某種方式。 –

5

看起來像你的問題可以很容易地解決使用LINQ。我會用簡化的例子來展示它,所以你必須將它調整爲你真正的一個。

假設我們有一個類名Item如下:

public class Item 
{ 
    public int Key { get; set; } 
    public int SubKey { get; set; } 
    public int Quantity { get; set; } 
} 

和列表(List<Item>):

var items = new List<Item>() { 
    new Item { Key = 1, SubKey = 1, Quantity = 100 }, 
    new Item { Key = 1, SubKey = 2, Quantity = 400 }, 
    new Item { Key = 2, SubKey = 1, Quantity = 60 }, 
    new Item { Key = 1, SubKey = 1, Quantity = 10 }, 
    new Item { Key = 2, SubKey = 1, Quantity = 30 }, 
    new Item { Key = 1, SubKey = 1, Quantity = 70 } 
}; 

現在,我們想總結Quantity與同一對要素KeySubKey(什麼也將刪除重複項)。有內LINQ GroupBy方法,讓我們使用它:

var groupedItems = items.GroupBy(x => new { x.Key, x.SubKey }) 
         .Select(g => new Item { 
          Key = g.Key.Key, 
          SubKey = g.Key.SubKey, 
          Quantity = g.Sum(x => x.Quantity) 
         }).ToList(); 

其結果是,我們有一個新的List<Item>只有一個,每Key/SubKey對元素和Quantity這是Quantit IES之和與項目該密鑰對。

作爲輸入輸出可以擴展爲<List<List<Item>>嗎?當然可以。

來源嵌套Item的藏品:

var nestedItems = new List<List<Item>>() { 
    new List<Item>() { 
     new Item { Key = 1, SubKey = 1, Quantity = 100 }, 
     new Item { Key = 1, SubKey = 2, Quantity = 400 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 60 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 10 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 30 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 70 } 
    }, 
    new List<Item>() { 
     new Item { Key = 1, SubKey = 1, Quantity = 100 }, 
     new Item { Key = 1, SubKey = 2, Quantity = 400 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 60 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 10 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 30 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 70 } 
    }, 
    new List<Item>() { 
     new Item { Key = 1, SubKey = 1, Quantity = 100 }, 
     new Item { Key = 1, SubKey = 2, Quantity = 400 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 60 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 10 }, 
     new Item { Key = 2, SubKey = 1, Quantity = 30 }, 
     new Item { Key = 1, SubKey = 1, Quantity = 70 } 
    } 
}; 

和查詢:

var nestedGroupedItems = nestedItems.Select(x => x.GroupBy(y => new {y.Key, y.SubKey }) 
                .Select(g => new Item { 
                 Key = g.Key.Key, 
                 SubKey = g.Key.SubKey, 
                 Quantity = g.Sum(y => y.Quantity) 
                }).ToList()).ToList(); 
+0

謝謝 - 我知道有一種方法可以用GroupBy和Sum來完成,但我沒有VS附近的測試。 –

+0

@MarcinJuraszek,將嘗試並實施此查詢,看看它是否有效。非常感謝 – Timujin

+0

IT WORKED :-) :-) :-) – Timujin