1

我有一个List<>类型world,在每个世界元素中都是一个List<>类型item,它本身包含一个Rectangle和一个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>();

我试图根据类型从项目列表中取出一个特定的矩形

    void getitem(string thetype, int world)
    {
        Rectangle  a = Worlds[world].
                       items.Where(f=> f.type == thetype).
                       Select(g => g.spriterect);
    }

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

4

5 回答 5

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;
于 2013-02-13T21:39:44.477 回答
2

你会想.Single在你之后使用.Select

如果不完全匹配,Single 将抛出异常。

Rectangle a = Worlds[world]
                   .items.Where(f=> f.type == thetype)
                   Select(g => g.spriterect).Single();
于 2013-02-13T21:40:04.103 回答
2

而不是 where 使用FirstOrDefault。如果它没有找到该项目,它将返回 null。

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

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

return null;
于 2013-02-13T21:41:50.910 回答
1

如果您只知道您将只能获得一个可以使用的值Single,或者SingleOrDefault您知道该项目可能不存在。

//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;
于 2013-02-13T21:41:05.723 回答
1

Where函数返回一个集合(符合条件的所有内容),而不仅仅是单个项目。您可能想使用Firstor Single,注意Single如果有多个匹配条件,则会抛出异常(如果没有,则两者都会抛出)。

于 2013-02-13T21:42:37.057 回答