2010-07-14 2 views
0

У меня есть 2 общие списки, которые не содержат все поля одного и того же типаКак сравнить 2 списка объектов и удалить элементы, которые не являются общими?

IList<Category> and List<CategoriesRow>Categories 

categoryList = IList<Category> 

но оба имеют общие поля Имя и ID.

Я хочу сравнить список Категория с категориейЛист и найти из категорииСписок, где categoryList [index] .ID не существует в списке всех категорий ID. Для всех тех, которые не существуют в Категории, мне придется удалить их из CatgoryList.

У меня было a previous post in which I was given examples of LINQ, но проблема в том, что я должен использовать Dynamic, подразумевая, что передаю categoryList и категории как динамические.

Может ли кто-нибудь дать мне пример, как это сделать, поскольку я понятия не имею, как это сделать.

+0

возможно дубликат [Как сравнить 2 списков объектов и удалить элементы, которые не распространены?] (Http://stackoverflow.com/ questions/3243631/how-to-compare-2-lists-of-objects-and-remove-the-items-that-are-not-common) –

+0

Почему вы * должны использовать динамический *? Почему бы не предпочесть безопасность типов над бесчисленными классами? Возможно, это вопрос учебника? (@Jon: это q. User281180 относится к самому себе;) – Abel

+0

ya, я думаю, мой вопрос был отправлен дважды! – learning

ответ

0

Первый запуск цикла всех элементов списка из CategoryList
Выполнить внутренний цикл всех элементов списка из Categories
Сравните идентификатор CategoryList [индекс] .id с Категории [InnerIndex] .id
Когда внутренний loop закончен, проверьте, является ли условие когда-либо истинным во всем цикле, если тогда идентификатор существует в категориях иначе.

0
for (int i = categoryList.Count-1; i >= 0; i--) 
{ 
    int id = categoryList[i].ID; 
    if (!Categories.Any(r => r.ID == id)) categoryList.RemoveAt(i); 
} 
+0

Я использую динамический, следовательно, не может использовать LINQ или лямбда – learning

+0

Почему бы и нет? Я могу использовать такой код, даже если 'CategoriesRow' или' Category' является динамическим. Используете ли вы какую-то бета-версию .NET4? Вы получаете исключение? Если да, отправьте его. –

0

Это может помочь вам

for (int i = 0; i < CategoryList.Count; i++) { 
     if (!CategoryList.Contains(Categories[i])) 
      Categories.RemoveAt(i); 
     if (!Categories.Contains(CategoryList[i])) 
      CategoryList.RemoveAt(i); 
    } 
+0

Я имею Ошибку сообщение об ошибке \t \t 4 Аргумент 1: не удается преобразовать из «API.Category в 'MvcUI.Models.CategoryRow' \t \ MvcUI \ Models \ ProjectModel.cs \t 55 MvcUI Категория является классом и CatregoryRow - это еще один класс, который я использую для списка learning

+0

4 Life: Это не сработает, поскольку два списка не одного типа. @ user281180: мой ответ делает * точно * то, что вы просили (удаляет объекты, у которых нет 'ID' в' Категории' из 'categoryList'). –

+0

@ Ярослав спасибо за ответ. Я использую динамику, и из-за этого я не могу использовать лямбда, поэтому не могу применить ее! В этом случае я не могу использовать LINQ. – learning

0
public class Category 
{ 
    public int Id; 
} 

public class CategoriesRow 
{ 
    public int Id; 
} 

public List<Category> RemoveNotUsedCategories(List<Category> categoryList, List<CategoriesRow> Categories) 
{ 
    List<Category> usedCategories = new List<Category>(); 

    foreach (Category usableCat in categoryList) 
    { 
     foreach (CategoriesRow catRow in Categories) 
     { 
      if (usableCat.Id == catRow.Id) 
      { 
       // Add categories that are used. 
       usedCategories.Add(usableCat); 
       // Will break the first loop. 
       break; 
      } 
     } 
    } 
    return usedCategories; 
} 
Смежные вопросы