تحديد عنصر غير معروف من مجموعة متعددة الأبعاد باستخدام LINQ

StackOverflow https://stackoverflow.com/questions/1009019

  •  06-07-2019
  •  | 
  •  

سؤال

لبلدي تسلية الشخصية، أنا أكتب ما آمل أن يكون أساس لعبة ليأتي لاحقا. في التيار، وأنا أعمل على لعبة "المجلس". يرجى مراعاة ما يلي:

class Board
{
    private Cube[,,] gameBoard;
    public Cube[, ,] GameBoard { get; }
    private Random rnd;
    private Person person;
    public Person _Person { get; }

    //default constructor
    public Board()
    {
        person = new Person(this);
        rnd = new Random();
        gameBoard = new Cube[10, 10, 10];
        gameBoard.Initialize();
        int xAxis = rnd.Next(11);
        int yAxis = rnd.Next(11);
        int zAxis = rnd.Next(11);

        gameBoard[xAxis, yAxis, zAxis].AddContents(person);
    }
}

وهذا:

class Person : IObject
{
    public Board GameBoard {get; set;}
    public int Size { get; set; }
    public void Move()
    {
        throw new NotImplementedException();
    }

    public void Move(Cube startLocation, Cube endLocation)
    {
        startLocation.RemoveContents(this);
        endLocation.AddContents(this);
    }

    public Person(Board gameBoard)
    {
        Size = 1;
        GameBoard = gameBoard;
    }

    public int[] GetLocation()
    {
        int[] currentLocation;
        var location =
            from cubes in GameBoard.GameBoard
            where cubes.GetContents.Contains(this)
            select cubes;
    }
}

وأنا أعلم أن هذا غير صحيح لذلك ربما لا حتى مضحك، ولكن هذا هو اقسى من التخفيضات الخام.

وأنا أحاول الحصول على GetLocation للعودة مؤشر محدد من Cube الذي يقع Person. ذلك أنه إذا كان الشخص في Board.GameBoard[1, 2, 10] سأكون قادرا على استرداد هذا الموقع (وربما باعتبارها int[] كما هو موضح أعلاه). ومع ذلك، في التيار، وأنا غير قادر على تجميع بسبب الخطأ التالي:

Could not find an implementation of the query pattern for source type 'Cubes.Cube[*,*,*]'. 'Where' not found.'

وكنت متأكد من أن LINQ أن تكون قادرة على الاستعلام المصفوفات متعددة الأبعاد، ولكن لم أجد أي وثائق حول كيفية القيام بذلك.

وأي اقتراحات، أو أنا في الطريق الخطأ كلي هنا؟

هل كانت مفيدة؟

المحلول

وLINQ لا يرى صفائف multidimential كما تريد للأنها لا تنفذ IEnumerable<T> (على الرغم من صفائف مؤشر واحد القيام به، وهو ما يفاجئ الناس). هناك العديد من الحلول: يمكنك تجنب LINQ للبحث المكعب أو يمكنك كتابة طريقة تمديد بنفسك أن يفعل مناحي أكثر التقليدية

.

وهذه هي الحالة التي يكون فيها أنا لن تستخدم LINQ القيام بالبحث، بل أكثر من ذلك وربما ستبقي بعض الإشارات إلى مختلف قطع اللعب في بنية بسيطة (ربما القاموس) الذي هو أسهل لتحديث وإدارة . كفكرة، فإن قطعة الكائن يعرف <م> حيث كان على متن الطائرة نفسها، ويمكن تحديث مكعب، حيث إنها انتقلت بإزالة نفسها من خلية واحدة وإضافة نفسها إلى آخر.

وسيكون من المهم معرفة ما إذا كان خلية واحدة يمكن أن تحتوي على أكثر من قطعة واحدة: إذا كان الأمر كذلك، سوف تحتاج كل خلية لتكون قائمة من نوع ما، وكذلك (يبدو أن الطريق في التعليمات البرمجية). وبمجرد الوصول إلى هذه النقطة، إذا كان هناك إلى حد كبير أقل قطع اللعب من الخلايا، وأنا ربما لن فعلا خلق "المكعب" نفسها على أنها بنية بيانات. سيتم رسمها والقطع المعروضة عبر بعض Z ترتيب الرسم الخوارزمية التي سحبت مباشرة من القائمة قطعة، بدلا من صفيف. هذا من شأنه أن يعتمد على أسلوب اللعبة على الرغم من: في حالة وجود قطع الصفات وصغيرة في عدد هذا من شأنه أن يعمل. إذا كانت اللعبة هي أشبه 3D العودة أو ما شابه ذلك، ثم مكعب الأصلي من شأنه أن يجعل الشعور ... انها حقا يتوقف على مدى "شخصية" (وبالتالي البيانات) لديها القطع.

نصائح أخرى

ويجعل الكثير من معنى بالنسبة لي لتحريك كثافة إعلان currentLocation [] إلى أعلى مستوى داخل فئة الشخص الخاص، وتوفير وسائل جالبة / اضع. ثم كل شخص يخزن موقعها الخاص.

لتكلفة الذاكرة من 3 [إينتس]، أن تنقذ نفسك من الحاجة إلى الاستعلام 1000 قاعدة البيانات في كل مرة تريد استرداد موقع الشخص.

وأعتقد أن الشخص يجب أن نقول للمجلس حيث هو، لا نطلب من المجلس. في otherwords، وأود أن إنشاء فئة Location3D (س، ص، ض)، واستخدام ذلك في فئة GamePiece أن كل الأشياء الأخرى على متن ترث منه. أن مخازن الموقع، ثم كل حتة يعرف موقعه.

public class Location3D
{
  public Location3D(int x, int y, int z) { X = x; Y = y; Z = z; }
  public int X { get; set; }
  public int Y { get; set; }
  public int Z { get; set; }
}

public abstract GamePiece
{
  public Location3d { get; set; }

public class Person: GamePiece // inherit GamePiece
{
  // everything else about Person
}

public class Board
{
  public Board()
  {
    person = new Person(this);
    rnd = new Random();
    gameBoard = new Cube[10, 10, 10];
    gameBoard.Initialize();
    int xAxis = rnd.Next(11);
    int yAxis = rnd.Next(11);
    int zAxis = rnd.Next(11);

    var location = new Location3D(xAxis, yAxis, zAxis);
    person.Location = location;

    GetCubeAt(location).AddContents(person);
  }

  public Cube GetCubeAt(Location3D location)
  {
    return gameBoard[location.X, location.Y, location.Z];
  }

  public Cube GetCubeAt(int x, int y, int z)
  {
    return GetCubeAt(new Location3D(x,y,z));
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top