سؤال

هل هناك وسيلة فعالة لاتخاذ مجموعة فرعية من مجموعة C # وتمريرها إلى حتة آخر من التعليمات البرمجية (بدون تعديل مجموعة الأصلي)؟ يمكنني استخدام CUDA.net التي لديه وظيفة التي نسخ مجموعة إلى GPU. وأود أن مثل تمرير دالة 10 من مجموعة وبالتالي نسخ كل 10 من مجموعة إلى GPU منفصل (لأغراض النقل بواسطة خط أنابيب).

يجب نسخ مجموعة في هذه الطريقة تكون فعالة مثل نسخها في دفعة واحدة. ويمكن القيام به مع رمز غير آمن وعادل الرجوع إلى موقع الذاكرة الصحيح ولكن بخلاف ذلك لست متأكدا. نسخ وظيفة CopyTo للمجموعة بأكملها إلى مجموعة أخرى حتى هذا لا يبدو مفيدا.

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

المحلول

حسنا، فما استقاموا لكم فاستقيموا أساء فهم السؤال من قبل.

وما تريده هو System.Buffer.BlockCopy System.Array.Copy .

والطرق LINQ ستكون غير فعالة بشكل مخيف. إذا كنت قادرا على إعادة استخدام المخزن المؤقت كنت تنسخ إلى، من شأنها أن تساعد أيضا كفاءة، وتجنب خلق مجموعة جديدة في كل مرة - مجرد نسخ اكثر من اللازم. إلا إذا كنت يمكن أن نقسم بك مجموعة "كبيرة" حتى وإن كان على قدم المساواة، عليك ان تحصل على واحد جديد للحالة الأخيرة.

نصائح أخرى

ولست متأكدا من مدى كفاءة هذا ولكن ...

int[] myInts = new int[100];

//Code to populate original arrray

for (int i = 0; i < myInts.Length; i += 10)
{
    int[] newarray = myInts.Skip(i).Take(10).ToArray();
    //Do stuff with new array
}

هل يمكن أن تحاول Marshal.Copy إذا كنت بحاجة للذهاب من صفيف من البايت إلى مؤشر غير المدارة. أن يتجنب خلق كود غير آمن بنفسك.

وتحرير: وهذا من شأنه بوضوح العمل إلا إذا كنت reimplement API الخاصة بهم. عذرا - يساء فهمه. تريد وسيلة subarray كفاءة.

ويبدو لي أن ما كنت تريد حقا هو المعهد في الطبقة الأصلية للشكل

void CopyToGpu(byte[] source, int start, int length);

هل يمكن استخدام أساليب الإرشاد وعودة العائد:

public static IEnumerable Part<T>(this T[] array, int startIndex, int endIndex )
{
    for ( var currentIndex = startIndex; currentIndex < endIndex; ++currentIndex )
        yield return array[currentIndex];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top