程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表?

开发过程中遇到从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表的问题如何解决?下面主要结合日常开发的经验,给出你关于从对象列表中复制特定项目,其中包含与对象 ID 对应的索引列表的解决方法建议,希望对你解决从对象列表中复制特定项目,其中包含与对象 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 表达式的嵌套循环排列(重命名为 partsIndicespartIds):

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,请注明来意。
标签: