سؤال

حصلت على وظيفة تقوم بإرجاع ملف Collection<string>, ، وهذا يطلق على نفسه بشكل متكرر ليعود في النهاية واحدًا كبيرًا Collection<string>.

الآن، أنا فقط أتساءل ما هو أفضل نهج لدمج القوائم؟ Collection.CopyTo() نسخ فقط إلى السلسلة []، واستخدام ملف foreach() الحلقة تبدو وكأنها غير فعالة.ومع ذلك، نظرًا لأنني أرغب أيضًا في تصفية التكرارات، أشعر أنني سأنتهي في النهاية بـ foreach الذي يستدعي Contains() على ال Collection.

أتساءل، هل هناك طريقة أكثر فعالية للحصول على دالة عودية تقوم بإرجاع قائمة من السلاسل بدون تكرارات؟ليس من الضروري أن أستخدم أ Collection, ، يمكن أن يكون أي نوع بيانات مناسب تقريبًا.

الاستثناء الوحيد هو أنني ملتزم بـ Visual Studio 2005 و.net 3.0، لذا لا يوجد LINQ.

يحرر: للتوضيح:تقوم الوظيفة بإخراج المستخدم من Active Directory، وتنظر إلى التقارير المباشرة للمستخدم، ثم تنظر بشكل متكرر إلى التقارير المباشرة لكل مستخدم.وبالتالي فإن النتيجة النهائية هي قائمة بجميع المستخدمين الموجودين في "سلسلة الأوامر" لمستخدم معين. وبما أن هذا يتم تنفيذه كثيرًا وفي الوقت الحالي يستغرق 20 ثانية لبعض المستخدمين، فأنا أبحث عن طرق لتحسينه.التخزين المؤقت للنتيجة لمدة 24 ساعة موجود أيضًا في قائمتي، ولكنني أريد أن أرى كيفية تحسينه قبل تطبيق التخزين المؤقت.

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

المحلول

إذا كنت تستخدم List<>، فيمكنك استخدام .AddRange لإضافة قائمة واحدة إلى القائمة الأخرى.

أو يمكنك استخدام عائد العائد لدمج القوائم بسرعة كما يلي:

public IEnumerable<string> Combine(IEnumerable<string> col1, IEnumerable<string> col2)
{
    foreach(string item in col1)
        yield return item;

    foreach(string item in col2)
        yield return item;
}

نصائح أخرى

قد ترغب في إلقاء نظرة على Iesi.Collections و الموسعة Iesi.Collections العامة (لأن الطبعة الأولى صدرت في 1.1 عندما لم تكن هناك أدوية عامة بعد).

يحتوي Extended Iesi على فئة ISet التي تعمل تمامًا مثل HashSet:فهو يفرض أعضاء فريدين ولا يسمح بالتكرارات.

الشيء الرائع في Iesi هو أنه قام بتعيين عوامل التشغيل بدلاً من الأساليب لدمج المجموعات، بحيث يكون لديك الاختيار بين اتحاد (|)، تقاطع (&)، XOR (^) وما إلى ذلك.

أظن HashSet<T> هي مساعدة عظيمة.

ال HashSet<T> يوفر الفصل عمليات مجموعة عالية الأداء.المجموعة هي مجموعة لا تحتوي على عناصر مكررة ، وعناصرها ليست في ترتيب معين.

ما عليك سوى إضافة عناصر إليه ثم استخدام CopyTo.


تحديث: HashSet<T> موجود في .Net 3.5

ربما يمكنك استخدامها Dictionary<TKey, TValue>.لن يؤدي تعيين مفتاح مكرر للقاموس إلى ظهور استثناء.

هل يمكنك تمرير المجموعة إليك عن طريق المرجع بحيث يمكنك فقط إضافة عناصر إليها، وبهذه الطريقة لن تضطر إلى إرجاع أي شيء.هذا ما قد يبدو عليه الأمر إذا قمت بذلك في لغة C#.

class Program
{
    static void Main(string[] args)
    {
        Collection<string> myitems = new Collection<string>();
        myMthod(ref myitems);
        Console.WriteLine(myitems.Count.ToString());
        Console.ReadLine();
    }

    static void myMthod(ref Collection<string> myitems)
    {
        myitems.Add("string");
        if(myitems.Count <5)
            myMthod(ref myitems);
    }
}

كما ذكر @Zooba، فإن المرور بالمرجع ليس ضروريًا هنا، إذا قمت بالتمرير حسب القيمة فسيعمل أيضًا.

بقدر ما يذهب الدمج:

أتساءل ، هل هناك طريقة أكثر كفاءة للحصول على وظيفة متكررة تُرجع قائمة من الأوتار دون تكرارات؟لست مضطرًا لاستخدام مجموعة ، يمكن أن يكون أي نوع بيانات مناسب إلى حد كبير.

تقوم وظيفتك بتجميع قيمة الإرجاع، أليس كذلك؟أنت تقوم بتقسيم القائمة المقدمة إلى النصف، واستدعاء الذات مرة أخرى (مرتين) ثم دمج تلك النتائج.

أثناء خطوة الدمج، لماذا لا تتحقق فقط قبل إضافة كل سلسلة إلى النتيجة؟إذا كان هناك بالفعل، تخطيه.

على افتراض أنك تعمل مع قوائم مرتبة بالطبع.

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