1

私はList<>タイプのを持っており、world各ワールド内の要素はそれ自体にとを含むList<>タイプのですitemRectanglestring

ここに世界の構造があります

`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);
    }

だから私はこれが.typethetypeを含む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

代わりに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 に答える
2

.Singleあなたはあなたの後に使いたいと思うでしょう.Select

一致するものが 1 つだけない場合、Single は例外をスローします。

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

使用できる値が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関数は、単一のアイテムではなく、コレクション(基準を満たすすべてのもの)を返します。条件に一致するものが複数ある場合は例外がスローされることに注意して、Firstまたはのいずれかを使用することをお勧めします(条件に一致するものが複数ある場合は両方がスローされます)。SingleSingle

于 2013-02-13T21:42:37.057 に答える