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();