2011-12-22 1 views
0

так из 3 следующих примеров, которые делают то же самое, я действительно склоняюсь к первому, но это действительно избыточна и злоупотребление LINQ, чтобы делать то, что путь, где вы можете создать все это как выражениеДолжен ли я создавать сложные вложенные структуры с Linq или традиционными циклами?

var Rand = new Random(); 
     Hosts = "abcdef".Select(x => 
        { 
         return new HostMachineToUpdate(x + "_Host", 
          Enumerable.Range(1, Rand.Next(3, 8)) 
          .Select(y => new VirtualMachineToUpdate(x + y.ToString() + "_VM")). 
          ToList() 
          ); 
        } 
       ) 
       .ToList(); 

     //traditional 
     Hosts = new List<HostMachineToUpdate>(); 
     for (int x = (int)'a'; x < (int)'e'; x++) 
     { 
      var Guests = new List<VirtualMachineToUpdate>(); 
      for (int y = 1; y < (new Random().Next(3, 8));y++) 
      { 
       Guests.Add(new VirtualMachineToUpdate((char)x + y.ToString() + "_VM")); 
      } 
      Hosts.Add(new HostMachineToUpdate((char) x + "Host",Guests)); 
     } 

     //very traditional. 
     Hosts = new List<HostMachineToUpdate>(); 
     int lower = (int)'a'; 
     int upper = (int)'e'; 
     for (int x = lower; x < upper; x++) 
     { 
      List<VirtualMachineToUpdate> Guests = new List<VirtualMachineToUpdate>(); 
      int randomItemNum = new Random().Next(3, 8); 
      for (int y = 1; y < randomItemNum; y++) 
      { 
       string vmname = (char)x + y.ToString() + "_VM"; 
       VirtualMachineToUpdate vm = new VirtualMachineToUpdate(vmname); 
       Guests.Add(vm); 
      } 
      string hostname = (char)x + "Host"; 
      HostMachineToUpdate host = new HostMachineToUpdate(hostname, Guests);     
      Hosts.Add(host); 
     } 
+2

которые вы предпочитаете читать и обслуживать? –

+2

Вы находите, что ваши случайные числа не так уж и случайны? Вы создаете много случайных экземпляров. Они посеяны с часами. Если часы не двигались в следующий раз, когда вы новый, то ... что тогда? Он будет засеян тем же значением, что и в прошлый раз. Используйте один случайный экземпляр, но не каждый раз, когда вам нужно случайное число. (Первая форма каждый раз для меня, кстати, я почти не каждый цикл с Linq) – spender

+0

Я предпочитаю, чтобы в первую очередь для читаемости, ремонтопригодности, вот как я думаю на разных языках, однако я думаю, что это смутит коллег и т. Д., Которые не знакомы с такого рода вещи. – klumsy

ответ

3

Мне лично не нравится сумма литье использовано в вашем традиционное решение.

Нужно ли все кастинг?

Не будет ли этот (непроверенный) код делать то, что требуется?

// traditional. 
    Hosts = new List<HostMachineToUpdate>(); 
    foreach (char x in "abcd") 
    { 
     List<VirtualMachineToUpdate> Guests = new List<VirtualMachineToUpdate>(); 
     int randomItemNum = new Random().Next(3, 8); 
     for (int y = 1; y < randomItemNum; y++) 
     { 
      Guests.Add(new VirtualMachineToUpdate(x + y.ToString() + "_VM")); 
     } 
     Hosts.Add(new HostMachineToUpdate(x + "Host", Guests)); 
    } 
+0

спасибо. я решил пойти и удалить кастинг из моего исходного linq, основанного на том, что вы делаете, поэтому теперь он начинается с «abcdef». Выберите (x => ....) – klumsy

1

Я предпочитаю декларативный подход, поэтому что-то вроде первого варианта. Но я предпочел бы использовать синтаксис C#. Что-то неопределенно:

(from x in Enumerable.Range('a', 'e'-'a') 
select new HostMachineToUpdate(
    (char)x + "_Host", 
    (from y in Enumerable.Range(1, new Random.Next(3,8)) 
    select new VirtualMachineToUpdate((char)x + y.ToString() + "_VM")).ToList()) 
.ToList(); 

Он чувствует себя близко. Может быть недостающим (или).

+0

C# синтаксис? Обе формы - синтаксис C#. – spender

+0

Конечно, они есть. Один из них использует лингвистические расширения для записи в виде выражения, в котором другой использует вызовы методов. Моя точка зрения заключается в том, что форма, которую я использовал, чувствует - для меня - менее неясная, теперь, когда мне стало удобно с синтаксисом. – drdwilcox

1

Если каждое из ваших решений выполняется достаточно быстро для ваших нужд, то можно с уверенностью сказать, что машина не может отличить эти параметры.

Важное соображение сводится к тому, насколько выразительным или ясным является код для читателя, поскольку в будущем кому-то придется понимать, отлаживать или расширять код. В приведенном выше случае попробуйте это. Оставьте код в покое на две недели. Когда вы вернетесь, решите, какой из параметров легче всего понять.

Для меня это проверка реальности. Раньше я гордился написанием некоторого умного кода, но на самом деле более простым решением было правильное решение.

Смежные вопросы