كيف كرر ذلك مجموعة متعددة الأبعاد من دون معرفة عدد من الأبعاد وعناصر المصفوفة التي مرت عليك؟

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

سؤال

وA SDK تعود لي مجموعة ذات أبعاد متعددة مثل:

و int[,,] theArray = new int[2,8,12];

وأحتاج لزيارة كل عنصر في مجموعة وإرجاع قيمة وموقف القيمة. ولست بحاجة للقيام بذلك دون معرفة عدد من الأبعاد وعناصر من مجموعة يتم تمريرها في.

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

المحلول

هل كان شيء من هذا القبيل هذا العمل بالنسبة لك؟ ومن recurses صفوف حتى تتمكن من استخدام foreach () والحصول على مجموعة تحتوي على مؤشرات هذا البند الحالي.

class Program
{
    static void Main(string[] args)
    {
        int[, ,] theArray = new int[2, 8, 12];
        theArray[0, 0, 1] = 99;
        theArray[0, 1, 0] = 199;
        theArray[1, 0, 0] = 299;

        Walker w = new Walker(theArray);

        foreach (int i in w)
        {
            Console.WriteLine("Item[{0},{1},{2}] = {3}", w.Pos[0], w.Pos[1], w.Pos[2], i);
        }

        Console.ReadKey();
    }

    public class Walker : IEnumerable<int>
    {
        public Array Data { get; private set; }
        public int[] Pos { get; private set; }

        public Walker(Array array)
        {
            this.Data = array;
            this.Pos = new int[array.Rank];
        }

        public IEnumerator<int> GetEnumerator()
        {
            return this.RecurseRank(0);
        }

        private IEnumerator<int> RecurseRank(int rank)
        {
            for (int i = this.Data.GetLowerBound(rank); i <= this.Data.GetUpperBound(rank); ++i)
            {
                this.Pos.SetValue(i, rank);

                if (rank < this.Pos.Length - 1)
                {
                    IEnumerator<int> e = this.RecurseRank(rank + 1);
                    while (e.MoveNext())
                    {
                        yield return e.Current;
                    }
                }
                else
                {
                    yield return (int)this.Data.GetValue(this.Pos);
                }
            }
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.RecurseRank(0);
        }
    }
}

نصائح أخرى

وتستخدم من أجل الحلقات:

for (int i=theArray.GetLowerBound(0);i<=theArray.GetUpperBound(0);++i)
{
    for (int j=theArray.GetLowerBound(1);j<=theArray.GetUpperBound(1);++j)
    {
        for (int k=theArray.GetLowerBound(2);k<=theArray.GetUpperBound(2);++k)
        {
           // do work, using index theArray[i,j,k]
        }
    }
}

إذا كنت لا تعرف عدد الأبعاد مقدما، يمكنك استخدام <لأ href = "http://msdn.microsoft.com/en-us/library/system.array.rank.aspx" يختلط = "noreferrer نوفولو"> Array.Rank لتحديد ذلك.

وأنا لست متأكدا من أنني أفهم سؤالك حول <م> "العودة موقف [ن، ن، ن]" ، ولكن إذا كنت في محاولة للعودة أكثر من قيمة واحدة من أسلوب، هناك زوجين من الطرق للقيام بذلك.

و• المعلمات إشارة Useoutor (على سبيل المثال، Int) التي تحصل لتعيين القيم التي يتم إرجاعها قبل عودته من طريقة.

و• ممر في صفيف، على سبيل المثال، مجموعة من ثلاثة [إينتس]، عناصر التي تحصل التي وضعتها طريقة قبل أن يعود.

و• عودة مجموعة من القيم، على سبيل المثال، مجموعة من ثلاثة [إينتس].

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top