سؤال

كنت أقرأ مقالاً في مجلة MSDN حول استخدام فئة لا تعد ولا تحصى في LINQ لتوليد مصفوفة عشوائية.تستخدم المقالة VB.NET ولست متأكدًا على الفور من المعادل في C#:

Dim rnd As New System.Random()
Dim numbers = Enumerable.Range(1, 100). _
    OrderBy(Function() rnd.Next)
هل كانت مفيدة؟

المحلول

ال المطور Fusion VB.Net لتحويل C# يقول أن رمز C# المكافئ هو:

System.Random rnd = new System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

للرجوع إليها في المستقبل، لديهم أيضا برنامج تحويل C# إلى VB.Net.هناك عدة أدوات أخرى متاح لهذا أيضا.

نصائح أخرى

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

int timesCalled = 0;
Random rnd = new Random();

List<int> numbers = Enumerable.Range(1, 100).OrderBy(r =>
   {
       timesCalled++;
       return rnd.Next();
   }
).ToList();

Assert.AreEqual(timesCalled, 100);
Random rnd = new Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(r => rnd.Next());

وماذا عن شيء حتى الآن أكثر سهولة ...

Enumerable.Range(1, 100).OrderBy(c=> Guid.NewGuid().ToString())

وأفضل يمكنني القيام به من على قمة رأسي دون الوصول إلى Visual Studio (الصلبان الأصابع):

System.Random rnd = New System.Random();
IEnumerable<int> numbers = Enumerable.Range(1, 100).OrderBy(rnd => rnd.Next);

واستخدام C5 عام مجموعة مكتبة ، هل يمكن أن مجرد استخدام الأسلوب Shuffle() مدمج:

IList<int> numbers = new ArrayList<int>(Enumerable.Range(1,100));
numbers.Shuffle();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top