我有一个方法可以检查项目列表,并在方法中的条件满足时返回项目。问题是,有时我需要返回多个项目才能在屏幕上绘制。所以如果我有2或3个需要绘制的项目,只有第一个是。这可能是我的绘图代码的问题,但我还不确定。返回多个对象
foreach(Item i in List)
{
if conditions are met
{
return i
有没有办法来检查此方法中返回多个项目?
我有一个方法可以检查项目列表,并在方法中的条件满足时返回项目。问题是,有时我需要返回多个项目才能在屏幕上绘制。所以如果我有2或3个需要绘制的项目,只有第一个是。这可能是我的绘图代码的问题,但我还不确定。返回多个对象
foreach(Item i in List)
{
if conditions are met
{
return i
有没有办法来检查此方法中返回多个项目?
为什么不使用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但我建议如果OP是C#的新手,在学习'yield'之前坚持LINQ&collections的基础知识:) – 2014-10-09 03:26:06
@RobertLevy - 绝对同意。我还添加了一些关于延迟执行的信息,如果不理解,可能会导致微妙的错误。 – 2014-10-09 03:42:56
我将不得不考虑使用收益率。我从来没有见过它 – 2014-10-09 03:47:04
您可以通过返回满足条件的项目清单做这样的事情:
List<YourItemType> itemsMeetingCondition = new List<YourItemType>();
foreach(Item i in List)
{
if(conditions are met)
{
itemsMeetingCondition.Add(i);
}
}
return itemsMeetingCondition;
第一种方式是使一个类有2个或多个属性。
这里将是一个回报类:
public class ColorSelection
{
public string ColorCode { get; set; }
public bool IsBold { get; set; }
}
在你的代码会在某个时候回到这一点。
如果它们都是同一类型,则使用第二种方法。例如,您将返回一个List<string>
。
可以使用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;
}
}
}
只要return语句被击中,在函数结束。所以你的代码只会返回一个项目,如果它发现它。你可能想要找到你找到的单独的匹配列表,然后返回。 – Abbath 2014-10-09 03:11:04
因此,我不会将该项目返回,而是将其添加到列表并从该列表中绘制? – 2014-10-09 03:12:01
是的,只需在函数的开头创建一个新列表,并为每个找到的匹配添加一个新列表。在完成对原始列表的迭代后,返回匹配列表。你也应该稍后检查一下,返回的列表不是空的。 – Abbath 2014-10-09 03:13:28