C# C中使用列表的do while循环的退出条件#

C# C中使用列表的do while循环的退出条件#,c#,C#,我有一个整数列表,l,和一个预定义的整数值行(在代码中从不进行操作)。如果行的值是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++) {

我有一个整数列表,
l
,和一个预定义的整数值行(在代码中从不进行操作)。如果行的值是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;
}
do
{
}while(勾选(第一行))
布尔检查(整数行,列表l)
{

对于(int i=1;i如果要检查列表是否包含从1到(第1行)的所有数字,可以使用如下
HashSet

var hashSet = new HashSet<int>(myList.Where(item => item >= 1 && item < row))
关于性能,这可能比您的解决方案更有效,因为列表只需要迭代一次(在您的解决方案中,您有
row-1
迭代,每个
包含
操作一次)。并且添加到
HashSet
被认为是一个O(1)操作

注意:这个解决方案的主要缺点是它不太清楚它所做的事情。所以请考虑给它添加注释。< /P> 另一种更具可读性的方法是明确检查集合中是否包含所有数字,如

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

如果将<代码>行>代码>为常数,则渐近时间将是相同的:O(n)用于构造<代码>哈什集,O(1)*O(1)=O(1)用于检查自身(第一行O(1),用于检查“行”的常数行数,第二O(1)为<代码>包含< /代码>函数……)

更适合于您是在寻找更好的方法来控制循环退出,还是寻找更好的方法来搜索行是否包含您正在搜索的元素?检查似乎是另一种方法。因此,他希望有一种方法来指示while循环基本上断开
。这是不可能的最有效/最不复杂的方法,如h如前所述,这个问题是关于改进工作代码的,因此属于。添加到集合中的是O(1),但您使用的构造函数是O(n),其中n是您输入的列表的大小。但仍然给出了+1。是的,这就是我所说的“列表只需迭代一次”的意思。您将无法得到小于O(n),因为(在最坏的情况下)您必须扫描列表直到其结束。根据列表的结构,您可能会得到更好的“最佳情况”或“平均情况”结果,如果您为构建哈希集执行显式循环,并在集达到
行1
计数时将其中断……没有非泛型
哈希集
,只有泛型
哈希集
,这就是您的意思吗?@svick是的,这就是我的意思。谢谢,我编辑了答案。
var hashSet = new HashSet<int>(myList);
var check = Enumerable.Range(1, row).All(number => hashSet.Contains(number));