2013-07-21 4 views
1

나는 진짜 문제가 list<list<object>> 인 것을 반복하고있다. 그리고 누구에게 그들의 통찰력을 묻고 싶다. 만약 I (32)리스트를 포함하는 list<list<object>> posCheckOptions 각각의 목록을 볼 수중첩 목록을 색인화하는 방법은 무엇입니까?

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

이 목록은, 예를 들면 1 등

위한 오브젝트 X 량, 0, 즉 348, 325을 포함 348의 내가 제거하고 싶습니다 중복 요소가 있습니다. 중복으로 말하면 스톡의 이름이 같을 수 있습니다. VODAFONE이 4 번이라면 Vodafone이 처음 발견 될 때까지 각각의 주식 수량을 추가하고 중복을 삭제하고 싶습니다. 내가 생각이 아니라 적어도 코드에 노력하고 무엇

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][1].date (내가 4 개 필드를 비교) (poscheckOptions에 요소를 posCheckOptions[0][0].date 비교 유형 whos는 목록입니다 T는 76 개의 표식을 가진 클래스입니다.) 만약 내가 비교하는 것이 평등하지 않다면 (즉, 중복되지 않은 상태에서 인덱스를 위로 이동하고 다음으로 계속 이동하는 등의 작업을 반복합니다. 중복 요소를 찾으면 내 인덱스에서 인덱스를 다시 이동하고 시작합니다.

메신저와 혼동 스럽다. 나는 2 개의 인덱스가 j에서 실행되고 있는지 확신하지 못한다. posCheckOptions[0][j] j는 j + 1로 가기 때문에 인덱스 m은 348 개의 모든 요소를 ​​반복했다. 내가 2를 삭제하면 어떤 조언 정말 환영 :-)

+2

당신이 하나 개의 목록 또는 모든 목록을 통해 중복을 방지해야합니까? –

+0

중복으로 생각하는 것이 불분명합니다. 가지고있는 데이터와 예상되는 결과에 대해 좀 더 자세히 설명해주십시오. – vines

+0

모든 목록에 있습니다. 그래서 모든리스트 (32의 주식 수)를 반복하고 각 주식은 25, 100으로 표시 될 수있는 많은 옵션 포지션을 포함하고 100을 25에 추가하고 100을 삭제하려고합니다. ... – Timujin

답변

0

입니다 ....

을 348 일 나는 다음을 수행 제안 :

  1. 목록의 개체 유형에 대한 IComparable 인터페이스를 구현하십시오. 이렇게하면 비교 로직을 유형 자체에 저장할 수 있습니다.
  2. posCheckOptions의 목록과 마찬가지로이 유형의 목록을 만듭니다. 포함 된 목록의 각 항목 위에 posCheckOptions
  3. 반복 처리의 모든 목록을 통해 bigList
  4. iterarte를 호출하고 항목이 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을 사용하여 쉽게 해결할 수 있습니다. 단순화 된 예제로 보여 드리겠습니다. 따라서 실제 상황을 조정해야합니다.

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

을 그리고 목록 (List<Item>) :

우리는 다음과 같이 클래스 이름 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 방법은, 그래서 그것을 사용하자 : Quantit 이거의 합이있는 항목을위한 하나의 모든 Key/SubKey 쌍에 대 한 요소와 Quantity로, 우리가 그 결과 새로운 List<Item>

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

그리고 쿼리 :

소스가 Item의 수집을 중첩

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

관련 문제