2

我有 foreach 来显示来自 myquery 的结果,当结果不为空时它可以工作。我想知道foreach还有其他吗?当 myquery 的结果为空时采取措施?

var rs = from cs in db.CsCustomers
                      from ai in db.ArInvoices
                      where cs.CustomerID == ai.CustomerID &&
                      ai.Kategori != null
                      orderby cs.Unit
                      select new
                      {
                          cs.CustomerID,
                          cs.Unit,
                          cs.Name
                      };

foreach (var r in rs)
{
     c = new TableCell();
     c.Text = r.CustomerID;
     c.RowSpan = jk;
     tr.Cells.Add(c);

     c = new TableCell();
     c.Text = r.Unit;
     c.RowSpan = jk;
     tr.Cells.Add(c);

     c = new TableCell();
     c.Text = r.Name;
     c.RowSpan = jk;
     tr.Cells.Add(c);

}
4

5 回答 5

2

为什么不先检查 -

if(rs == null)
{}
else
{
  foreach.....
}
于 2012-08-15T07:14:52.827 回答
1

不,它没有 else 运算符。你可以把它包在一个if else

var rs = from cs in db.CsCustomers
                      from ai in db.ArInvoices
                      where cs.CustomerID == ai.CustomerID &&
                      ai.Kategori != null
                      orderby cs.Unit
                      select new
                      {
                          cs.CustomerID,
                          cs.Unit,
                          cs.Name
                      };
if(rs != null && rs.Any()) //for the .Count you have to add using System.Linq;
     foreach (var r in rs)
     {
          c = new TableCell();
          c.Text = r.CustomerID;
          c.RowSpan = jk;
          tr.Cells.Add(c);

          c = new TableCell();
          c.Text = r.Unit;
          c.RowSpan = jk;
          tr.Cells.Add(c);

          c = new TableCell();
          c.Text = r.Name;
          c.RowSpan = jk;
          tr.Cells.Add(c);
     }
}else{
     //the else part 
}
于 2012-08-15T07:16:01.307 回答
1

也许你会需要这个。无论如何,如果您经常需要空列表的默认行为,您可以创建下一个扩展方法。

void Main()
{
    var elements = Enumerable.Range(0,20);
    elements.ForEachWithElse(x=>Console.WriteLine (x),
                            ()=>Console.WriteLine ("no elements at all"));

    elements.Take(0).ForEachWithElse(x=>Console.WriteLine (x),
                            ()=>Console.WriteLine ("no elements at all"));
}

public static class MyExtensions
{    
    public static void ForEachWithDefault<T>(this IEnumerable<T> values, Action<T> function, Action emptyBehaviour)
    {
        if(values.Any())
            values.ToList().ForEach(function);
        else 
            emptyBehaviour();
    }
}
于 2012-08-15T08:04:04.113 回答
0

不,没有 foreach-else 循环...如果您需要该功能,请使用不同类型的循环(for-loop 或 do-while-loop)或先测试元素的数量。

于 2012-08-15T07:15:49.437 回答
0

这是一篇关于如何实现某些东西的文章。

这是您每天在 IEnumerable 上进行的常规 foreach,但允许您指定“循环动作”和“其他动作”,后者在循环之后执行,除非您通过从前者返回 false 来中断循环。它比 Python 有点笨拙,但仍然有用

相反,您可以做的是通过if测试检查它是否为空/空,然后在该else部分中执行某些操作。但是,在做 DB 的事情时,最好在没有结果时返回一个空列表,而不是返回 null。

于 2012-08-15T07:17:44.933 回答