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-好了:)