我的控制器中有一个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,我知道它可以通过循环完成,但我想避免这种情况,因为结果有时可能包含大量数据。
答案 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
的当前值。)
有问题吗?