使用.where和.select从列表中的列表中选择单个元素

时间:2013-02-13 21:35:41

标签: c# string list ienumerable rectangles

我有一个List<>类型world,并且每个世界元素中都有List<>类型item,其本身包含Rectangle和{ {1}}

继承世界的结构

string

和项目

`class world
    public Items[] items { get; set; }

    public world(int nooflevels, int noofitems)
    {
        //when creating a world make the items
        items = new Items[noofitems];

        for (int i = 0; i < noofitems; i++)
        {
            items[i] = new Items();
        }
     }        
}`

这个世界列表是这样创建的     class Items { public new Rectangle spriterect; public string type { get; set; } public Items() { spriterect.X = 0; spriterect.Y = 0; spriterect.Width = 0; spriterect.Height = 0; type = "default"; } }

我试图根据类型

从项目列表中获取特定的矩形
List<world> Worlds = new List<world>();

所以我希望这会选择包含.type thetype的项目[] .spriterect 我希望它返回该项目中的矩形,但它返回一个IEnumerable 如何根据类型返回单个矩形?

5 个答案:

答案 0 :(得分:4)

您应该从项目中选择单个项目。如果应该有指定类型的单个矩形,则使用SingleOrDefault

var item = Worlds[world].items.SingleOrDefault(i => i.type == thetype);
if (item != null) 
    a = item.spriterect;

如果您完全确定指定类型的矩形始终存在,那么只需使用Single

Rectangle a = Worlds[world].items.Single(i => i.type == thetype).spriterect;

答案 1 :(得分:2)

您希望在.Select之后使用.Single

如果没有一个匹配,Single将抛出异常。

Rectangle a = Worlds[world]
                   .items.Where(f=> f.type == thetype)
                   Select(g => g.spriterect).Single();

答案 2 :(得分:2)

而不是使用FirstOrDefault。如果找不到该项,则返回null。

var primary = Worlds[world].FirstOrDefault(f=> f.type == thetype);

if (primary != null)
   return primary.spriterect;

return null;

答案 3 :(得分:1)

如果您只知道自己只获得一个值,则可以使用SingleSingleOrDefault,如果您知道该项目可能不存在。

//use if you know the rectangle will be there, and there will be only 1 that matches the criteria
Rectangle a = Worlds[world].items.Single(f => f.type == thetype).spriterect;

//use if the rectangle may not be there, and if it is there will be only 1 that matches the criteria
var item = Worlds[world].items.SingleOrDefault(f => f.type == thetype);
if (item != null)
    Rectangle a = item.spriterect;

答案 4 :(得分:1)

Where函数返回一个集合(符合条件的eveything),而不仅仅是一个项目。您可能希望使用FirstSingle,并注意Single如果有多个匹配条件,则会抛出异常(如果没有,则两者都会抛出)。< / p>