寻找优雅的LINQ查询,替代SelectMany

时间:2014-08-08 12:20:44

标签: c# linq

这是一个简单的问题,但我很难找到一个优雅的解决方案。假设我有一个简单的数据结构,即项目组列表。每个组都有一个唯一的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的冗余迭代?

1 个答案:

答案 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);