Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何避免linq查询C中的两个嵌入循环# var listOfIds=new List(); var allItems=IEnumerable(); foreach(CollectionId中的变量id) { listOfIds.AddRange(allItems .Where(p=>p.Data.FirstOrDefault(m=>m.Key==“myId”).Value==id) .选择(x=>x.Id)); }_C#_Linq - Fatal编程技术网

C# 如何避免linq查询C中的两个嵌入循环# var listOfIds=new List(); var allItems=IEnumerable(); foreach(CollectionId中的变量id) { listOfIds.AddRange(allItems .Where(p=>p.Data.FirstOrDefault(m=>m.Key==“myId”).Value==id) .选择(x=>x.Id)); }

C# 如何避免linq查询C中的两个嵌入循环# var listOfIds=new List(); var allItems=IEnumerable(); foreach(CollectionId中的变量id) { listOfIds.AddRange(allItems .Where(p=>p.Data.FirstOrDefault(m=>m.Key==“myId”).Value==id) .选择(x=>x.Id)); },c#,linq,C#,Linq,我希望避免使用AddRange,但在这种情况下只使用Add,可能只使用FirstOrDefault来代替上次选择的情况 这可能吗?如果可能,如何实现?这种方法如何: var listOfIds = new List<string>(); var allItems = IEnumerable<Info>(); foreach (var id in collectionIds) { listOfIds.AddRange(allItems

我希望避免使用
AddRange
,但在这种情况下只使用
Add
,可能只使用
FirstOrDefault
来代替上次选择
的情况


这可能吗?如果可能,如何实现?

这种方法如何:

var listOfIds = new List<string>(); 
var allItems = IEnumerable<Info>();

foreach (var id in collectionIds)
{
    listOfIds.AddRange(allItems
             .Where(p => p.Data.FirstOrDefault(m => m.Key == "myId").Value == id)
             .Select(x => x.Id));
}
var listOfIds=new List();
var allItems=IEnumerable();
var groupedAllItems=allItems.GroupBy(x=>x.Data.FirstOrDefault(m=>m.Key==“myId”)?.Value??“MyIdNotFound”);
//CollectionID应为HashSet类型,以使包含快速
AddRange(groupedAllItems.Where(x=>collectionId.Contains(x.Key)).SelectMany(x=>x));

假设您的原始代码提供了正确的数据,具体来说,您可以:

  • 仅关注
    p.Data
    中的第一项包含匹配值和
  • p.Data
    将始终至少包含一个元素
  • 然后,此代码将为您提供相同的输出:

    var listOfIds = new List<string>(); 
    var allItems = IEnumerable<Info>();
    
    var groupedAllItems = allItems.GroupBy(x => x.Data.FirstOrDefault(m => m.Key == "myId")?.Value ?? "MyIdNotFound");
    
    //collectionIds should be of type HashSet<string> for the contains to be fast
    listOfIds.AddRange(groupedAllItems.Where(x => collectionIds.Contains(x.Key)).SelectMany(x => x));
    
    但是,如果您确实关心
    p.Data
    中的任何值是否匹配,那么这将更合适:

    var listOfIds = allItems
        .Where(p => collectionIds.Contains(p.Data.First(m => m.Key == "myId").Value))
        .ToList();
    

    您可能想在这里使用
    Contains
    ,但我有点怀疑您的代码没有达到您希望的效果。
    Data.FirstOrDefault(…)
    是不寻常的。@DavidG我更关心的是多次查询
    IEnumerable
    的循环,而此时很可能是静态的列表。@frank Well a
    包含的
    可以解决这个问题,所以这不是真正的问题。好的。如果你有更好的决定,请给我举个例子。谢谢。如果
    p.Data
    中的第二项包含匹配值,会发生什么情况?
    var listOfIds = allItems
        .Where(p => p.Data.Any(m => m.Key == "myId" && 
                                    collectionIds.Contains(m.Value)))
        .ToList();