Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从具有与对象id对应的索引列表的对象列表中复制特定项_C#_.net - Fatal编程技术网

C# 从具有与对象id对应的索引列表的对象列表中复制特定项

C# 从具有与对象id对应的索引列表的对象列表中复制特定项,c#,.net,C#,.net,我有一个索引列表list,我只想将id与我的索引列表匹配的对象从对象列表list复制到另一个列表 我的代码用于获取所有自行车部件的列表,并仅返回与我的自行车类型对应的部件(这就是我使用开关盒的原因)。我试图使用List.Findall()方法,但我真的不知道如何在我的案例中应用它 string Type = "City"; internal virtual List<BikePart> getBikeParts(List<BikePart> allP

我有一个索引列表
list
,我只想将id与我的索引列表匹配的对象从对象列表
list
复制到另一个列表

我的代码用于获取所有自行车部件的列表,并仅返回与我的自行车类型对应的部件(这就是我使用开关盒的原因)。我试图使用
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,17,17,17,18,27,27,28,29,29,31,33,34,40,40,42,52};

    switch (Type)
    {
        case "City":
            partsIndices.AddRange(new List<int>() {5,21,30,35,35,39 });//by default black and 26"
            break;
        case "Explorer":
            partsIndices.AddRange(new List<int>() {5,25,30,37,37,39 });//by default black and 26"
            break;
        case "Adventure":
            partsIndices.AddRange(new List<int>() {11,25,37,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;
}
string Type=“城市”;
内部虚拟列表getBikeParts(列出所有部件)//尚未完成
{
List partsByModel=新列表();
List partsIndices=new List(){1,2,15,16,17,17,17,18,27,27,28,29,29,31,33,34,40,40,42,52};
开关(类型)
{
案例“城市”:
AddRange(new List(){5,21,30,35,35,39});//默认为黑色和26“
打破
案例“探索者”:
AddRange(new List(){5,25,30,37,37,39});//默认为黑色和26“
打破
“冒险”一案:
AddRange(新列表(){11,25,37,37});//默认为黑色和26“
打破
违约:
//错误
打破
}
foreach(零件中的变量idx)
{
foreach(所有部件中的var部件)
{
if(part.id==idx)
{
partsByModel.Add(部分);
}
}
}
返回partsByModel;
}

我认为代码可以正常工作,但我希望避免使用for和foreach循环。有没有办法减少和优化此方法?

列表。FindAll
只向谓词提供
BikePart
实例,因此不能使用它按索引选择元素(除非
BikePart
s id属性始终与其索引匹配)

如果要避免使用显式循环,可以使用Linq解决它,如下所示:

returnpartsindices.Select(index=>allParts[index]).ToList();
Edit:我刚刚重新阅读了您的评论,它似乎暗示
id
属性确实总是与索引匹配

在这种情况下,
List.FindAll
可以这样使用:

返回allParts.FindAll(part=>partsIndices.Contains(part.id));
但是这效率较低,因为它需要对每个现有零件(而不仅仅是选定零件)进行线性查找(
包含
调用)。
它还将更改现有代码的行为,因为如果
partsIndices
多次包含相同的索引,它不会返回重复的条目(与您的示例相同)

更新:问题编辑澄清了部分“索引”实际上是用来表示ID的

在这种情况下,按列表索引进行简单的查找是行不通的。 这是作为Linq表达式的嵌套循环排列(重命名为
partsIndices
partIds
):

returnpartids.Select(id=>allParts.First(part=>part.id==id)).ToList();
另一种方法是首先将列表转换为字典,该字典将每个零件id映射到零件实例,并使用该字典进行查找。 此转换只需执行一次,并且可以重新用于其他零件查询

Dictionary partsById=allParts.ToDictionary(part=>part.id);
返回partIds.Select(id=>partsById[id]).ToList();

好的,谢谢,
返回partsIndices.Select(index=>allParts[index]).ToList();
对我不起作用,索引超出了范围。是的,我想在列表中保留副本。我将代码编辑为双foreach循环,因为单个循环不起作用:`foreach(varidx in partsIndices){foreach(var part in allParts){if(part.id==idx){partsByModel.Add(part);}}}}}`可以在
列表中选择()
方法仍在使用吗?我不明白为什么会让事情变得如此复杂。如果原始的、高效的、单循环按预期工作,为什么要将其更改为低效的、更混乱的嵌套循环构造呢?关于
IndexOutOfRangeException
:第一个Linq表达式与循环逻辑o完全等效如果它崩溃,这意味着你的
partsIncides
列表包含一个等于或大于零件总数的数字。它不起作用,我遇到了“索引超出范围”的问题“当我添加重复项时,我也没有在上一个循环中使用part.id,这与我的partsIndices列表不匹配,因为没有id 0(所有的part都来自mySQL中的数据库)我明白了,所以
partsIndices
真的应该被称为
partIds
。在这种情况下,高效的索引查找将不起作用。请参阅我的编辑。为什么不想使用循环?我看到的第一个优化是减少不可读性。为什么在列表为ID时调用“索引”?为什么添加范围()它们被分配到一个新的列表中,而赋值就足够了?为什么还要使用这样一个无法维护的整数列表?@CodeCaster,我更喜欢1-2行高效的代码而不是双循环。是的,我计划重命名我的变量以使其更具可读性。我还想合并两个列表(其中一个更改为自行车类型),我如何像你说的那样赋值?整数列表是因为它来自MySQL中的数据库。