2010-08-04 58 views
3

遺憾的新手問題的2列表,但是,我是新來的節目..提高代碼:比較元素

我想檢查是否有在listOfDifferentTypes已經不超過一元的TypeA的。我有以下代碼:

 public void CheckType (Object param) 
    { 
      if (param is TypeA) 
      { 
       int i = 0; 
       TypeA paramToCheck = (TypeA) param; 

       foreach (var paramB in listOfDifferentTypes) 
       { 
        if (paramB is TypeA) 
        { 
         var paramInList = (TypeA) paramB; 
         if (paramToCheck.ID == paramInList.ID) 
         { 
          i++; 
         } 
        } 
       } 
       if (i > 1) 
       { 
        paramToCheck.m_Error = "ErrorText"; 
       }  
      } 
    } 

我認爲這不是很乾淨的解決方案。此代碼是否可以改進/優化?

回答

2

你可以使用LINQ這:)它看起來不錯:

//Checks for string - resplace <string> with <some type> for other types 
private bool moreThanOne(List<object> differentTypes) 
{ 
    return differentTypes.OfType<string>().Count() > 1; 
} 

用法:

List<object> listOfDifferentTypes = new List<object> { "string", 13, 52, "string", 54.3f }; 

var res = moreThanOne(listOfDifferentTypes); 

我看你也檢查某種ID的那麼試試這個:

已更新完成您的代碼正在做的事

更新時間:更換.Count之間的()與.Skip(1)。任何(),所以它就會停止,如果超過1被發現:)

private void CheckType(object param, List<object> differentTypes) 
{ 
    var paramToCheck = param as TypeA; 

    if (paramToCheck == null) return; 

    var res = differentTypes.OfType<TypeA>().Where(t => t.ID == paramToCheck.ID).Skip(1).Any(); 

    if (res) paramToCheck.m_Error = "error text"; 
} 

正如我已經做了,你可以替換:

if (param is TypeA) 
{ 
    TypeA paramToCheck = (TypeA) param; 
    ... Do something 

有了:

TypeA paramToCheck = param as TypeA; //Returns null if not a TypeA 
if (param == null) return; 

... Do something 

這是一個快一點:)

+0

感謝,LINQ看起來非常酷。我必須考慮使用它) – user410570 2010-08-04 11:16:05

1

你原來的解決方案,重寫:

public void CheckType(Object param) 
{ 
    TypeA paramToCheck = param as TypeA; 
    int count = 0; 
    if (paramToCheck != null) 
    { 
     foreach (var paramB in listOfDifferentTypes) 
     { 
      var paramInList = paramB as TypeA; 
      if (paramInList != null && paramToCheck.ID == paramInList.ID) 
      { 
       count++; 

       if (count > 1) 
       { 
        paramToCheck.m_Error = "ErrorText"; 
        break; 
       } 
      } 
     } 
    } 

}

注:

  • 使用as關鍵字與針對null的比較來執行的類型轉換,
  • 組合多個條件成單個if語句(使用AND(&&)運營商),
  • 使用break聲明只要您的條件得到滿足,就立即退出foreach循環。
  • 這只是您的原始代碼的清理版本;有毫無疑問,更好的方法來達到你想要的行爲:-)

編輯:更新回覆:評論(!感謝您指出我的錯誤以前)

+0

嗯它不完全一樣?如果有一個或多個實例,您的代碼將寫入錯誤。如果有超過一個實例,他的代碼會寫入錯誤。糾正我,如果我錯了:) – 2010-08-04 10:20:11

+0

我的不好 - 代碼更新! – robyaw 2010-08-04 10:26:22