如何从c#中的List对象中删除

时间:2013-08-01 18:48:57

标签: linq c#-4.0 asp.net-mvc-4 entity-framework-4

我的控制器中有一个Action方法,它返回一个List Object

  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}]

我想做的是:
在我的Action方法“strsortorder”和“dltIds”中使用另外两个参数  有一个像这样的ID列表:

    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}]

任何人都可以用linq或其他任何方式帮助我实现这一目标吗? 我想在最大程度上避免任何类型的循环或froeach,我知道它可以通过循环完成,但我想避免这种情况,因为结果有时可能包含大量数据。

1 个答案:

答案 0 :(得分: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();
              });
}

这是如何运作的:

首先,我使用拆分从逗号分隔的排除列表中创建列表。

我创建了一个字典,其中键是排序ID,值是一个整数,增加一个。

对于过滤,我会在继续处理项目之前查看项目是否在排除数组中。

然后我对键和字典进行匹配并返回值 - 这将按照列表的顺序对事物进行排序,因为我在创建值时增加了计数器。如果一个项目不在字典中,我会返回一个超过字典中最大值的值,该值必须是项目的计数。 (我本可以使用orderCount的当前值。)

有问题吗?