سؤال

وأنا لا تزال جديدة على C # و لقد كنت تناضل مع مختلف القضايا المطروحة على المصفوفات. لقد حصلت على مجموعة من الأشياء البيانات الوصفية (أزواج قيمة اسم) وأود أن أعرف كيف خلق فقط عدد الكائنات "InputProperty" أنني بحاجة حقا. في هذه الحلقة لقد ضبط تعسفي عدد من العناصر إلى 20 وأنا أحاول أن إنقاذ عندما يصبح إدخال فارغ ولكن هذه الخدمة على الطرف المتلقي لهذه الشبكة لا يحب أي عناصر فارغة تمريرها إليه:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[20];  // how to make this "dynamic"
    int i;
    for (i = 0; i < nvPairs.Length; i++)
    {
        if (nvPairs[i] == null) break;
        ip[i] = new InputProperty();
        ip[i].Name = "udf:" + nvPairs[i].Name;
        ip[i].Val = nvPairs[i].Value;
    }
    update.Items = ip;
    return update;
}

وباختصار، أقول لدي 3 أزواج namevalue فقط في مجموعة المدخلات المذكورة أعلاه؟ بدلا من تخصيص 20 عنصرا لمجموعة تسمى الملكية الفكرية، وكيف يمكن رمز هذه الملكية الفكرية لذلك ليس فقط كبيرة كما يجب أن يكون. يتم تمرير الكائن التحديث عبر خدمة ويب أخرى حتى التسلسل مهم (أي لا يمكنني استخدام NameValueCollection على، الخ).

وp.s. هذه هي الطريقة الوحيدة لمتابعة على سؤال نشرها من خلال مرفق "إضافة تعليقات"؟

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

المحلول

إذا كنت لا ترغب في استخدام List، ArrayList، أو غيرها من جمع حيوي الحجم ومن ثم تحويله إلى مجموعة (هذا هو الأسلوب انصح، بالمناسبة)، ثم سيكون لديك لتخصيص مجموعة إلى حجمه الأقصى الممكن، تتبع عدد العناصر التي وضعت فيه، ثم قم بإنشاء مجموعة جديدة فقط مع تلك العناصر في ما يلي:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[20];  // how to make this "dynamic"
    int i;
    for (i = 0; i < nvPairs.Length; i++)
    {
        if (nvPairs[i] == null) break;
        ip[i] = new InputProperty(); 
        ip[i].Name = "udf:" + nvPairs[i].Name;
        ip[i].Val = nvPairs[i].Value;
    }
    if (i < nvPairs.Length)
    {
        // Create new, smaller, array to hold the items we processed.
        update.Items = new InputProperty[i];
        Array.Copy(ip, update.Items, i);
    }
    else
    {
        update.Items = ip;
    }
    return update;
}

وأسلوب بديل سيكون لتعيين دائما update.Items = ip; ثم تغيير إذا لزم الأمر:

update.Items = ip;
if (i < nvPairs.Length)
{
    Array.Resize(update.Items, i);
}

وانها أقل الرمز، ولكن من المرجح أن ينتهي به على نفس القدر من العمل (أي خلق مجموعة جديدة ونسخ العناصر القديمة).

نصائح أخرى

InputProperty[] ip = new InputProperty[nvPairs.Length]; 

وأو يمكنك استخدام قائمة مثل ذلك:

List<InputProperty> list = new List<InputProperty>();
InputProperty ip = new (..);
list.Add(ip);
update.items = list.ToArray();

وشيء آخر أود أن أشير، في C # يمكنك delcare استخدام متغير كثافة العمليات الخاصة بك في لحلقة اليمين داخل الحلقة:

for(int i = 0; i<nvPairs.Length;i++
{
.
.
}

وفقط لأنني في مزاج، وهنا طريقة أنظف للقيام بذلك طريقة IMO:

private Update BuildMetaData(MetaData[] nvPairs)
{
        Update update = new Update();
        var ip = new List<InputProperty>();

        foreach(var nvPair in nvPairs)
        {
            if (nvPair == null) break;
            var inputProp = new InputProperty
            {
               Name = "udf:" + nvPair.Name,
               Val = nvPair.Value
            };
            ip.Add(inputProp);
        }
        update.Items = ip.ToArray();
        return update;
}

هل هو بحاجة إلى أن تكون مجموعة؟ إذا كنت تستخدم ArrayList أو أحد الكائنات الأخرى المتاحة في C #، فلن يكون هذا القيد إلى المضمون مع. جدول هاش، IDictionnary، IList، الخ .. كل السماح لعدد الديناميكي للعناصر.

استخدم هذا:

 Array.Resize(ref myArr, myArr.Length + 5);

هل يمكن استخدام قائمة داخل الطريقة وتحويلها إلى مصفوفة في نهاية المطاف. ولكن أعتقد إذا كنا نتحدث عن قيمة الحد الأقصى من 20، التعليمات البرمجية بشكل أسرع.

    private Update BuildMetaData(MetaData[] nvPairs)
    {
        Update update = new Update();
        List<InputProperty> ip = new List<InputProperty>();
        for (int i = 0; i < nvPairs.Length; i++)
        {
            if (nvPairs[i] == null) break;
            ip[i] = new InputProperty();
            ip[i].Name = "udf:" + nvPairs[i].Name;
            ip[i].Val = nvPairs[i].Value;
        }
        update.Items = ip.ToArray();
        return update;
    }

وأو في C # 3.0 باستخدام System.Linq يمكنك تخطي قائمة وسيطة:

private Update BuildMetaData(MetaData[] nvPairs)
{
        Update update = new Update();
        var ip = from nv in nvPairs
                 select new InputProperty()
                 {
                     Name = "udf:" + nv.Name,
                     Val = nv.Value
                 };
        update.Items = ip.ToArray();
        return update;
}

استخدم Array.CreateInstance لإنشاء مجموعة بشكل حيوي.

    private Update BuildMetaData(MetaData[] nvPairs)
    {
        Update update = new Update();
        InputProperty[] ip = Array.CreateInstance(typeof(InputProperty), nvPairs.Count()) as InputProperty[];
        int i;
        for (i = 0; i < nvPairs.Length; i++)
        {
            if (nvPairs[i] == null) break;
            ip[i] = new InputProperty();
            ip[i].Name = "udf:" + nvPairs[i].Name;
            ip[i].Val = nvPairs[i].Value;
        }
        update.Items = ip;
        return update;
    }

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

InputProperty[] ip = (InputProperty[])Array.CreateInstance(typeof(InputProperty), length);

وأنا لا أوصي به، على الرغم من. مجرد عصا مع

List<InputProperty> ip = ...
...
update.Items = ip.ToArray();

والحل. انها ليست أقل بكثير performant لل، وطريقة تبحث على نحو أفضل.

ويمكنك إنشاء صفيف حيوي في هذه الطريقة:

 static void Main()
    {
        // Create a string array 2 elements in length:
        int arrayLength = 2;
        Array dynamicArray = Array.CreateInstance(typeof(int), arrayLength);
        dynamicArray.SetValue(234, 0);                              //  → a[0] = 234;
        dynamicArray.SetValue(444, 1);                              //  → a[1] = 444;
        int number = (int)dynamicArray.GetValue(0);                      //  → number = a[0];


        int[] cSharpArray = (int[])dynamicArray;
        int s2 = cSharpArray[0];

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