簡體   English   中英

使用LINQ從對象列表中隔離特定對象

[英]Using LINQ to isolate a particular object from a list of objects

替代文字
(來源: yfrog.com

我正在嘗試制作入侵者克隆。 屏幕上有30個以5x 6矩陣排列的外星人。 我需要給最底層的外星人開槍的能力。 我正在使用LINQ根據Location.X將外星人分為5個組,然后對降序的組進行排序,然后我需要選擇一個組(給我5個組),然后選擇該組中的第一個外星人並使用它坐標射擊。

我下面的代碼,很好,有效,但是任意行中的外星人都在歡欣鼓舞,而不僅僅是最底層。 請看下面我的代碼,告訴我什么地方不對。 (r = Random類的一個實例,所有外星人都在一個稱為入侵者的列表中)。

 {
           var query = (from inv in invaders
                         group inv by inv.Location.X
                         into invgroup
                         orderby invgroup.Key descending 
                         select invgroup).ToList();

            var invfirst = query[r.Next(query.Count)].First();


                invaderShots.Add(new Shot(
                        new Point(invfirst.Area.X + invfirst.Area.Width / 2, invfirst.Area.Y + invfirst.Area.Height + 5),
                        displayrect, Shot.Direction.Down));

        }

編輯:

已解決。現在,在David B向正確的方向推動我之后,它可以按要求工作。

最終代碼如下。 鑒於大量的分組/排序,可能確實需要一些改進。 如果有人對此有建設性的話,我就是耳朵(或眼睛)。 感謝所有的幫助。

   List<Invader> firstinvader = invaders.GroupBy(inv => inv.Location.X)
                .Select(g => g.OrderByDescending(inv => inv.Location.Y)).ElementAt(r.Next(5)).ToList();

            firstinvader.Sort(comparerByLocation);
            Invader item = firstinvader[firstinvader.Count -1];

            if(invaderShots.Count < 2)
            {
                invaderShots.Add(new Shot(
                     new Point(item.Area.X + item.Area.Width / 2, item.Area.Y + item.Area.Height / 2),
                     displayrect, Shot.Direction.Down));

            }
            else
            {
                return;

            }

您是在訂購團體,而不是在訂購入侵者 這可能會做到:

var query = (from inv in invaders
             group inv by inv.Location.X
             into invgroup
             orderby invgroup.Key descending 
             select invgroup.OrderBy(inv => inv.Location.Y)).ToList();

(您可能希望使順序降序,具體取決於Y是向上還是向下。)

盡管這可能行得通,但我不確定始終進行所有排序是否理想……您是否可以將入侵者存儲在可以幫助您更輕松地完成此操作的數據結構中?

您正在按Location.X分組,我想是該 然后,您可以按列號對這些組進行排序-請注意,這是對進行排序,而不是對組中的項目進行排序。 由於您隨后選擇了一個隨機組,因此您訂購它們的事實無關緊要。 一旦選擇了一個隨機組-原始外星人的隨機列-然后選擇該組中的First一個,但是由於外星人未排序,因此您將得到一個任意外星人。

要解決此問題,您需要確保按高度將排序(我想是Location.Y ),以便在選擇隨機選擇的組中的First時,它是最底下的外星人。 更改

select invgroup).ToList();

select invgroup.OrderBy(inv => inv.Location.Y)).ToList();

(假設您的Y軸朝着正確的方向運動,即可提供您想要的東西!)

List<Invader> firstInvaders = invaders
  .GroupBy(inv => inv.Location.X)
  .Select(g => g
     .OrderByDescending(inv => inv.Location.Y)
     .First())
  .ToList();

Invader shooter = firstInvaders[r.Next(firstInvaders.Count)];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM