2014-10-09 60 views
2

我有一個方法可以檢查項目列表,並在方法中的條件滿足時返回項目。問題是,有時我需要返回多個項目才能在屏幕上繪製。所以如果我有2或3個需要繪製的項目,只有第一個是。這可能是我的繪圖代碼的問題,但我還不確定。返回多個對象

foreach(Item i in List) 
{ 
    if conditions are met 
    { 
     return i 

有沒有辦法來檢查此方法中返回多個項目?

+0

只要return語句被擊中,在函數結束。所以你的代碼只會返回一個項目,如果它發現它。你可能想要找到你找到的單獨的匹配列表,然後返回。 – Abbath 2014-10-09 03:11:04

+0

因此,我不會將該項目返回,而是將其添加到列表並從該列表中繪製? – 2014-10-09 03:12:01

+0

是的,只需在函數的開頭創建一個新列表,併爲每個找到的匹配添加一個新列表。在完成對原始列表的迭代後,返回匹配列表。你也應該稍後檢查一下,返回的列表不是空的。 – Abbath 2014-10-09 03:13:28

回答

8

爲什麼不使用LINQ?

// return an enumerable 
return items.Where(item => item.SomeCondition); 

或者

// execute once and store in a list 
return items.Where(item => item.SomeCondition).ToList(); 

有這兩個例子之間的重要區別。第一個返回可用於遍歷列表的IEnumerable。第二個例子遍歷這些項目並將它們存儲在一個列表中。

這也是yield的候選人。像第一個例子一樣,這返回IEnumerable<T>

foreach(var item in items) 
{ 
    if(conditions){ 
     yield return item; 
    } 
} 
+1

+1但我建議如果OP是C#的新手,在學習'yield'之前堅持LINQ&collections的基礎知識:) – 2014-10-09 03:26:06

+0

@RobertLevy - 絕對同意。我還添加了一些關於延遲執行的信息,如果不理解,可能會導致微妙的錯誤。 – 2014-10-09 03:42:56

+0

我將不得不考慮使用收益率。我從來沒有見過它 – 2014-10-09 03:47:04

1

您可以通過返回滿足條件的項目清單做這樣的事情:

List<YourItemType> itemsMeetingCondition = new List<YourItemType>(); 
foreach(Item i in List) 
{ 
    if(conditions are met) 
    { 
     itemsMeetingCondition.Add(i); 
    } 
} 
return itemsMeetingCondition; 
0

第一種方式是使一個類有2個或多個屬性。

這裏將是一個回報類:

public class ColorSelection 
    { 
     public string ColorCode { get; set; } 
     public bool IsBold { get; set; } 

    } 

在你的代碼會在某個時候回到這一點。

如果它們都是同一類型,則使用第二種方法。例如,您將返回一個List<string>

0

可以使用yield關鍵字並返回IEnumerable的,而不是:

產量與交互脫穎而出ACH-循環。這是一個上下文關鍵字: yield僅在某​​些語句中是關鍵字。它只允許在需要時生成foreach循環中的每個 迭代。以這種方式 它可以提高性能。

http://www.dotnetperls.com/yield

public IEnumerable<Item> GetItems() 
{ 
    foreach(Item i in List) 
    { 
     if conditions are met 
     { 
      yield return i; 
     } 
    } 
}