2016-04-20 2 views
0

Я пытаюсь удалить информацию, которая находится на третьем уровне словаря, и может использовать ее только после удаления этой информации. Но я не могу, что я делаю неправильно?Удалить элемент на третьем уровне словаря

public class Person 
{ 
    int id; 
    string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public int ID 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    public List<Product> ListProd; 
} 

public class Product 
{ 
    public int idProd; 
    public string Description; 
    public List<Tax> listTax; 
} 

public class Tax 
{ 
    public int idTax; 
    public string Value; 
} 

//Method 
public void SomeMethod() 
{ 
     Dictionary<int, List<int>> dicRemove = new Dictionary<int, List<int>>(); 
     List<int> listTaxToRemove = new List<int>(); 
     for (int m = 8; m < 10; m++) 
     { 
      listTaxToRemove.Add(m); 
     } 
     dicRemove.Add(10, listTaxToRemove); 

     Dictionary<int, List<Person>> dic = new Dictionary<int, List<Person>>(); 
     List<Person> list = new List<Person>(); 
     for (int i = 0; i < 2; i++) 
     { 
      Person d = new Person(); 
      d.ID = i; 
      d.Name = "Person " + i; 
      d.ListProd = new List<Product>(); 
      for (int j = 3; j < 6; j++) 
      { 
       Product p = new Product(); 
       p.idProd = j; 
       p.Description = "Product " + j; 
       d.ListProd.Add(p); 
       p.listTax = new List<Tax>(); 
       for (int m = 7; m < 10; m++) 
       { 
        Tax t = new Tax(); 
        t.idTax = m; 
        t.Value = "Tax " + m; 
        p.listTax.Add(t); 
       } 
      } 
      list.Add(d); 
     } 

     dic.Add(10, list); 

     var q = dic.Select(s => s.Value 
         .Select(s1 => s1.ListProd 
           .Select(s2 => s2.listTax 
         .RemoveAll(r =>!dicRemove[s.Key].Contains(r.idTax))))).ToList(); 

} 

Я попробовал несколько способов, с помощью итераций, этот подход только удаление ненужных записей.

Спасибо!

+0

Всегда добавить язык программирования тегов! –

+0

Спасибо! Отредактировано – KnD182

+0

@ KnD182, можете ли вы оставить отзыв на мой ответ, пожалуйста? он решает проблему или нет? – ASh

ответ

0

RemoveAll не вызывается из-за отсроченного исполнения Select

у вас есть 3 Select и только один ToList()

q имеет тип System.Collections.Generic.List'1[System.Collections.Generic.IEnumerable'1[System.Collections.Generic.IEnumerable'1[System.Int32]]]

есть вложенные IEnumerable объект, который не перечисленное

здесь рабочий вариант , но bsolutely нечитаемые, не делайте этого, как этого

var q = dic.Select(s => s.Value.Select(s1 => s1.ListProd.Select(s2 => s2.listTax.RemoveAll(r=>!dicRemove[s.Key].Contains(r.idTax))) 
                 .ToList()) 
           .ToList()) 
     .ToList(); 

улучшенным вариант

foreach(var pair in dic) 
    foreach(var person in pair.Value) 
     foreach(var prod in person.ListProd)    
      prod.listTax.RemoveAll(t=>!dicRemove[pair.Key].Contains(t.idTax)); 
Смежные вопросы