1

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

  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”中使用另外两个参数,它们具有这样的 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,我知道它可以通过循环来完成,但我想避免这种情况,因为结果有时可能包含大量数据。

4

1 回答 1

1

我意识到你可以使用 aArrayList而不是 aDictionary并且它会更快。我认为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,值是加一的整数。

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

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

问题?

于 2013-08-01T18:55:43.190 回答