2010-07-21 54 views
4

我有對象,稱爲屬性,本質上,我需要做下面的C#C#與對象列表語句的語法

<pseudocode> 
if (list.Contains(Attribute where getName() == "owner")) 
{ 
    do stuff 
} 
</pseudocode> 

我遇到的問題的列表是嵌套支架我的代碼 - 它不起作用,顯然,但大部分如果應該是正確的,這只是讓我需要做的位正斜槓,我不知道如何。

if (attributes.Contains(Attribute /where/ attribute.getName() == "Owner")) 
    { 
     string value = attr.getValue(); 
     value = value.Replace(domain, ""); 
     user = value; 
     UserExists(value); 
    } 

我可能正在密集,但我不得不重新啓動3天的發展,以改變ev使用Attribute對象的一些東西,所以我的大腦被摧毀了。抱歉。

回答

12

,嘗試

if(attributes.Any(attribute=>attribute.getName()=="Owner")) 
{ 
    do stuff 
} 

這具有很好的優勢任何維護這些代碼的人都可以閱讀。

1

如果您正在使用一個版本支持LINQ(3.5或更高版本)的.NET你可以使用LINQ到對象

if (attributes.Count(a => a.getName() == "Owner") > 0) 
+5

請使用'attributes.Any'而不是'attributes.Count',因爲計數循環遍歷整個集合,並且任何強制當找到一個屬性時,t返回true - >提高性能 – Zenuka 2010-07-21 13:48:39

+1

如果您正在測試它是否至少有一個*,則不應使用Count()'。相反,應該使用'Any()',因爲這會將枚舉器移動到第一個元素('Count()'將會遍歷所有元素)。 – TheCloudlessSky 2010-07-21 13:49:02

+0

上面的評論是正確的 - 我的監督 – 2010-07-21 13:51:47

3
if(list.Exists(e=>e.getName() == "owner")) { 
    //yup 
} 
0

你使用.NET 3.5以上,如果是這樣,並假設是 '屬性' 從IEnumerable的衍生,你可以做到以下幾點:

if (attributes.Any(attrib=>attrib.GetName() == "Owner")) 
{ 
    //Do code here... 
} 
0

請看看:

var filteredAttributes = from attribute in Attributes 
         where string.Compare(attribute.getName() ,"Owner",true)==0 
         select attribute; 

foreach(var attribute in filteredAttributes) 
{ 
      string value = attr.getValue(); 
       value = value.Replace(domain, ""); 
       user = value; 
       UserExists(value); 

} 
0

好吧,我工作了,我發現了一個更好的方法來做到這一點:

for (int i = 0; i < attributes.Count; i++) 
{ 
    if (attributes[i].getName() == "Owner") 
    { 
     string value = attributes[i].getValue(); 
     value = value.Replace(domain, ""); 
     user = value; 
     UserExists(value); 
    } 
} 

它更有意義,並且實際上起作用。

+0

這不是做你最初說的,這將動作列表中與「所有者」匹配的每個屬性,你的原始僞代碼只測試條件,然後行動一些代碼,如果該條件遇到了...... – 2010-07-21 13:54:07

+0

它只是需要休息一下; UserExists(value)之後; – 2010-07-21 13:57:17

+0

即使有中斷,代碼似乎不太清楚與一個循環比if語句中的存在測試 – murgatroid99 2010-07-21 14:00:41

0

您可以使用LINQ分離出所需要的屬性...

IEnumerable<TAttribute> ownerAttributes = 
    attributes.Where(attribute => attribute.getName() == "Owner"); 

...然後遍歷這些屬性,應用相關的邏輯...

foreach(TAttribute attribute in ownerAttributes) 
{ 
    // Do stuff... 
} 
2

沒有LINQ !:

if (list.Exists(delegate(Attribute a) { return a.GetName() == "Owner"; }))