2011-12-22 34 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

你喜歡閱讀和維護哪一個? – 2011-12-22 00:58:20

+2

你是否發現你的隨機數並非全是隨機數?您正在創建許多隨機實例。他們從時鐘播種。如果下一次你的新時鐘沒有移動,那麼......然後呢?它將被播種與上次相同的價值。使用單個隨機實例,每次需要一個隨機數時都不要新建一個實例。 (第一種形式對我來說每一次,順便說一句,因爲LINQ的我幾乎每一個循環) – spender 2011-12-22 00:59:03

+0

我傾向於第一種迄今爲止可讀性,可維護性,這就是我想在不同的語言,但是我認爲這會混淆同事等誰不熟悉這種事情。 – klumsy 2011-12-22 17:59:06

回答

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 2011-12-22 17:54:58

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 2011-12-22 01:04:10

+0

當然是。一個只是使用語言擴展將它寫成表達式,另一個使用方法調用。我的觀點只不過是,我使用的形式對我來說感覺不那麼模糊,現在我已經習慣了語法。 – drdwilcox 2011-12-22 13:12:47

1

如果您的每個解決方案的執行速度足以滿足您的需求,那麼可以肯定地說機器無法區分這些選項。

重要的考慮因素是人類讀者對代碼的表達能力或清晰程度,因爲將來有人必須理解,調試或擴展代碼。在上面的情況下,試試這個。單獨留下代碼兩週。當您返回時,請確定哪些選項最容易理解。

對我自己來說這是一個現實檢查。在過去,我爲編寫一些聰明的代碼感到自豪,但實際上更簡單的解決方案是正確的解決方案。