2013-08-01 3 views
1

У меня есть метод действий в мой контроллер, который возвращает список объектовКак удалить из списка объектов в C#

Public ActionResult GetCats(long Id,string strsortorder,string dltIds) 
    { 
     var Result=objrepo.GetCats(Id);//this method returns me List of Result 

    } 

Мой массив выглядит следующим образом:

var Result=[{CatId:1015,CatName:Abc},{CatId:1016,CatName:Acd}, 
{CatId:1017,CatName:Adf},{CatId:1018,CatName:CDdf},{CatId:1019,CatName:asdas}, 
{CatId:1020,CatName:Abc},{CatId:1021,CatName:Abc},{CatId:1022,CatName:Abc}, 
{CatId:1023,CatName:Abc},{CatId:1024,CatName:Abc}] 

То, что я хочу сделать является:
Использование более двух параметров в моем методе Действие «strsortorder» и «dltIds» , которые имеют список идентификаторов, как это:

strsortorder="1021,1015,1016,1019,1022"; 
    dltIds="1017,1018,1020"; 

Из этого «результата», возвращаемого из моего метода, я хочу удалить записи, которые находятся в «dltids», а оставшийся массив должен быть отсортирован в порядке, который у меня есть в «strsortorder»;

В конце концов новый объект должен выглядеть следующим образом:

var NewResult=[{CatId:1021,CatName:Abc},{CatId:1015,CatName:Abc}, 
{CatId:1016,CatName:Acd},{CatId:1019,CatName:asdas},{CatId:1022,CatName:Abc}, 
{CatId:1023,CatName:Abc},{CatId:1024,CatName:Abc}] 

Может ли один помочь мне в acheiving это в LINQ или любым другим способом?
Я хочу, чтобы избежать любого типа цикла или froeach здесь для максимальной степени, я знаю, что это можно сделать путем цикла, но я хочу избежать этого, так как результат может иногда содержать большие объемы данных.

+0

Как элементы, не имеющие элемента в strsortorder, отсортированы - до конца? – Hogan

ответ

1

Я понял, что вы можете использовать ArrayList вместо Dictionary, и это будет быстрее. Я думаю, Dictionary понятно, как это работает, но вот такое «лучше» реализацию с использованием списка массива:

var excludeList = dltIds.Split(",".ToCharArray()); 
ArrayList sortList = new ArrayList(strsortorder.Split(",".ToCharArray())); 

var NewResult = 
     Result.Where(item => ! excludeList.Contains(item.CatId.ToString())) 
     .OrderBy(item => { 
      if (sortList.Contains(item.CatId.ToString())) 
       return sortList.IndexOf(item.CatId.ToString()); 

      return sortList.Count; 
     }); 

Оригинальный ответ ниже:

Public ActionResult GetCats(long Id,string strsortorder,string dltIds) 
{ 
    var Result=objrepo.GetCats(Id);//this method returns me List of Result 

    var excludeList = dltIds.Split(",".ToCharArray()); 
    int orderCount = 0; // used in the closure creating the Dictionary below 
    var sortList = strsortorder.Split(",".ToCharArray()) 
          .ToDictionary(x => x,x => orderCount++); 

    // filter 
    var NewResult = 
     Result.Where(item => ! excludeList.Contains(item.CatId.ToString())) 
       .OrderBy(item => { 
       if (sortList.ContainsKey(item.CatId.ToString())) 
        return sortList[item.CatId.ToString()]; 
       return sortList.Count(); 
       }); 
} 

Как это работает:

Сначала я создаю списки из списка разделенных запятыми исключить список с помощью split.

Это я создаю словарь с ключом, являющимся идентификатором заказа, и значением является целое число, которое увеличивается на единицу.

Для фильтрации я смотрю, находится ли элемент в массиве exclude, прежде чем продолжить обработку элемента.

Затем я делаю сортировку по совпадению с ключом и словарем и возвращаю значение - это будет сортировать вещи в порядке списка, так как я увеличил счетчик при создании значений. Если элемент не находится в словаре, я возвращаю больше, чем максимальное значение в словаре, которое должно быть подсчетом элементов. (Вместо этого я мог бы использовать текущее значение orderCount.)

Вопросы?

+0

Я хочу, чтобы мой результат был отсортирован таким образом, который находится в моем newresult и порядок сортировки списка находится в моем «strsortorder» – user2643287

+0

@ user2643287 Да, вы сказали, что в вопросе ... как насчет элементов, которые не находятся в список порядка сортировки? – Hogan

+0

те должны быть добавлены в последние – user2643287

Смежные вопросы