Linq 如何从c中的列表对象中删除#

Linq 如何从c中的列表对象中删除#,linq,c#-4.0,asp.net-mvc-4,entity-framework-4,Linq,C# 4.0,Asp.net Mvc 4,Entity Framework 4,我的控制器中有一个返回列表对象的操作方法 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:A

我的控制器中有一个返回列表对象的操作方法

  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="1021,1015,1016,1019,1022";
    dltIds="1017,1018,1020";
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}]
我想做的是:
在我的操作方法“strsortorder”和“dltIds”中使用另外两个参数 其ID列表如下所示:

 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="1021,1015,1016,1019,1022";
    dltIds="1017,1018,1020";
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}]
从这个方法返回的“Result”中,我想删除“dltids”中的记录,剩下的数组应该按照我在“strsortorder”中的顺序排序

最后,新对象应如下所示:

 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="1021,1015,1016,1019,1022";
    dltIds="1017,1018,1020";
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或其他任何方式实现这一点吗?

我想最大程度地避免任何类型的循环或翻滚,我知道可以通过循环来实现,但我想避免这种情况,因为结果有时可能包含大量数据。

我意识到可以使用
数组列表
而不是
字典
,这样会更快。我认为
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从逗号分隔的排除列表中创建列表

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

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

然后,我对键和字典进行排序,然后返回值——这将按照列表的顺序进行排序,因为我在创建值时增加了一个计数器。如果某个项不在字典中,我将返回比字典中的最大值多一个值,该值必须是项的计数。(我本可以使用当前值
orderCount


问题?

我意识到你可以使用
ArrayList
而不是
字典
,这样会更快。我认为
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从逗号分隔的排除列表中创建列表

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

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

然后,我对键和字典进行排序,然后返回值——这将按照列表的顺序进行排序,因为我在创建值时增加了一个计数器。如果某个项不在字典中,我将返回比字典中的最大值多一个值,该值必须是项的计数。(我本可以使用当前值
orderCount


问题?

strsortorder中没有elementID的项目如何排序--到底?strsortorder中没有elementID的项目如何排序--到底?我希望我的结果以这种方式排序,即在我的新结果中,列表的排序顺序是在我的“strsortorder”中@user2643287是的,你在问题中说过。。。那么不在排序顺序列表中的元素呢?这些元素应该添加到最后一个列表中。不在sortorder或deletedids中的剩余对象应该添加到新列表的最后一个列表中object@user2643287-好了:)我希望我的结果以这种方式排序,它在我的newresult中,列表的排序顺序在我的newresult中“strsortorder”@user2643287是的,您在问题中说了……不在排序顺序列表中的元素呢?这些元素应该添加到最后一个中。不在sortorder或deletedids中的剩余对象应该添加到新列表的最后一个中object@user2643287-好了:)