这是一个简单的问题,但我很难找到一个优雅的解决方案。假设我有一个简单的数据结构,即项目组列表。每个组都有一个唯一的ID,每个项目也都有唯一的ID。
我想从给定的组中获取给定的项目(如果存在),或者null
。我想出了两个实现,我都不喜欢它们:
public class Item
{
public int ItemId;
}
public class Group
{
public int GroupId;
public Item[] Items;
}
public static class Test
{
public static Item GetItemV1(this IEnumerable<Group> groups, int groupId, int itemId)
{
return groups.SelectMany(g => g.Items)
.FirstOrDefault(i => i.ItemId == itemId);
}
public static Item GetItemV2(this IEnumerable<Group> groups, int groupId, int itemId)
{
var group = groups.FirstOrDefault(g => g.GroupId == groupId);
if (group != null)
{
return group.Items.FirstOrDefault(i => i.ItemId == itemId);
}
return null;
}
}
是否可以作为单行查询完成,但没有SelectMany
的冗余迭代?
答案 0 :(得分:4)
目前,您的第一个选项不会检查组ID,但这很容易修复:
return groups.Where(g => g.GroupId == groupId)
.SelectMany(g => g.Items)
.FirstOrDefault(i => i.ItemId == itemId);
或者,如果只有一个具有给定ID的组,并且如果您找到该组但未找到该项目,则您想要停止:
return groups.Where(g => g.GroupId == groupId)
.Take(1) // Don't look through other groups after finding one match
.SelectMany(g => g.Items)
.FirstOrDefault(i => i.ItemId == itemId);