使用列表c#的do-while循环的退出条件

时间:2013-12-29 16:40:09

标签: c#

我有一个整数列表l和一个预定义的整数值行(从不在代码中操作)。如果row的值是5,那么我希望循环退出,如果l包含1,2,3,4或者如果它是3那么l应该包含1,2,依此类推任何值。我已经设计了一种方法来做到这一点,但由于我的意思是在应用程序中使用它,有人可以告诉我一个更好的方法来做到这一点:

do
{
}while(check(row,l))

boolean check(int row,list<int> l)
{
  for(int i=1;i<row;i++)
  {
    if((l.contains(i))
      continue();
    else
      return true;
  }
  return false;
}

1 个答案:

答案 0 :(得分:3)

如果你想检查你的列表是否包含从1到(第1行)的所有数字,你可以使用这样的HashSet

var hashSet = new HashSet<int>(myList.Where(item => item >= 1 && item < row))

这会将列表中的所有“相关”项添加到Set。

由于HashSet最多包含一个项目,因此您可以检查Count以确保所有数字都存在,例如:

var check = hashSet.Count == (row - 1)

关于性能,这可能比您的解决方案更有效,因为列表只需要迭代一次(在您的解决方案中,您有row-1个迭代,每个Contains操作一个迭代。添加到HashSet被认为是O(1)操作。

注意:此解决方案的主要缺点是它不能立即显示它的作用。所以请考虑添加评论。

如果所有数字都包含在Set中,那么另一种更易读的方法是明确检查,例如

var hashSet = new HashSet<int>(myList);
var check = Enumerable.Range(1, row).All(number => hashSet.Contains(number));

如果将row视为常数,则渐近时间将相同:构造HashSet的O(n)和O(1)* O(1)= O(1) )用于检查本身(第一个O(1)表示要检查的常数“行”,第二个O(1)表示Contains函数...)