大佬教程收集整理的这篇文章主要介绍了从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个索引列表 List<int>
,我想从对象列表 List<BikeParts>
复制到另一个列表,只复制 ID 与我的索引列表匹配的对象。
我的代码用于获取所有 BikeParts 的列表,并仅返回与我的自行车类型相对应的零件(这就是我使用开关盒的原因)。我正在尝试使用 List.Findall()
方法,但我真的不知道如何在我的情况下应用它。
string Type = "City";
internal virtual List<BikePart> getBikeParts(List<BikePart> allParts)//NOT FINNISHED YET
{
List<BikePart> partsByModel = new List<BikePart>();
List<int> partsIndices = new List<int>() {1,2,15,16,17,18,27,28,29,31,33,34,40,42,52};
switch (Type)
{
case "City":
partsIndices.AddRange(new List<int>() {5,21,30,35,39 });//by default black and 26"
break;
case "Explorer":
partsIndices.AddRange(new List<int>() {5,25,37,39 });//by default black and 26"
break;
case "Adventure":
partsIndices.AddRange(new List<int>() {11,37});//by default black and 26"
break;
default:
//error
break;
}
foreach (var IDx in partsIndices)
{
foreach (var part in allParts)
{
if (part.ID == IDx)
{
partsByModel.Add(part);
}
}
}
return partsByModel;
}
我认为代码是有效的,但我想避免使用 for 和 foreach 循环。有没有什么办法可以减少和优化这个方法?
List.FindAll
仅向谓词提供 BikePart
实例,因此您不能使用它来按索引选择元素(除非 BikePart
的 id 属性始终与其索引匹配)。
如果你想避免使用显式循环,你可以像这样使用 Linq 解决它:
return partsIndices.Select(index => allParts[index]).ToList();
编辑:我刚刚重新阅读了您的评论,似乎暗示 id
属性确实始终与索引匹配。
在这种情况下,List.FindAll
可以像这样使用:
return allParts.FindAll(part => partsIndices.Contains(part.id));
但是这效率较低,因为它需要对每个现有部分(不仅仅是选定部分)进行线性查找(Contains
调用)。
它还会改变您现有代码的行为,因为如果 partsIndices
多次包含相同的索引(就像您的示例一样),它不会返回重复的条目。
更新:问题编辑澄清了“索引”部分实际上是用来表示 ID。
在这种情况下,简单的按列表索引查找是行不通的。
这是作为 Linq 表达式的嵌套循环排列(重命名为 partsIndices
为 partIds
):
return partIds.Select(id => allParts.First(part => part.id == id)).ToList();
另一种方法是首先将您的列表转换为字典,该字典将每个部件 ID 映射到部件实例并将其用于查找。 此转换只需执行一次,并可重复用于其他零件查询。
Dictionary<int,BikePart> partsById = allParts.ToDictionary(part => part.id);
return partIds.Select(id => partsById[id]).ToList();
以上是大佬教程为你收集整理的从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表全部内容,希望文章能够帮你解决从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。