如何确定foreach循环是否找到0结果

时间:2014-05-23 15:00:40

标签: c#

我有一个运行foreach循环的程序,为在目录中找到的每个文件运行一个方法。 (记录当前的文件号,也在该文件上运行方法)

我想知道如果foreach循环在循环中没有找到文件,那么返回'0'结果的智能方法是什么。

这可能很容易实现,但我现在有点困惑......

以下是我运行循环的方法。

int count = 1;
Log("| ", true);
Log("| Looping For Specific Criteria...", true);

// Loop through all files for condition
foreach (string fullFileName in FileList)
{
    // Run a method and report a result..
    count++;
}

如果循环在这种情况下找不到符合我标准的内容,我想报告“找到0个结果”

我考虑在foreach循环后添加以下内容......

if (count == 1)
{
    Log("0 results found");
}

但是当我声明我的int值以获得像...这样的日志列表时,我必须从1开始。

  • 1)文件方法完整
  • 2)文件方法完成

......等等

我以为我可以使用我的int值来确定计数是否已经改变但问题是,count整数始终至少保持值为1并且运行我的if语句也会抛出“找到0个结果“如果在foreach循环中只处理了1个文件,则显示”消息。

有什么想法吗?

6 个答案:

答案 0 :(得分:11)

这肯定不是唯一的做事方式,但我认为这是最明确表达你意图的惯用语。应该主要为程序员编写代码,如果需要优化则只编写编译器。

除了上述建议之外,您还可以使用LINQ并执行

,而不是使用for循环
if(!FileList.Any())
{
   ....
}

为了满足您的要求..

If the loop found nothing matching my criteria in this case, I would like to report "0 results found"

您可以使用.Where

var fileList = yourSource.Where(x => SomeFunctionThatSatisifiesYourRequirements(x));
// check to see if there are any elements, if not, report it and exit the function
// this is more idiomatic than checking an incremental variable IMO
if(!fileList.Any())
{
    Console.WriteLine("No results found");
    return;
}
// iterate over each element
// if there are none we won't reach this point
// and even if we do get here with no elements
// the for loop expands into nothing anyway
foreach(var element in fileList)
   YourFunction(element);

您希望将SomeFunctionThatSatisifiesYourRequirements替换为执行需求检查的函数。它需要签名bool FunctionName(string fileName)yourSource也需要更换。我会为你做这件事,但你问题中的代码并没有让我继续下去:(

最后,我想指出OP的问题是“我如何确定foreach循环是否找到0结果”,最好的方法是检查你迭代的东西是否有0在执行foreach循环之前的结果 - IEnumerable.Where(predicate).Any()是最常用的方法。如果您不关心使用已过滤的IEnumerable.Any(predicate),也可以IEnumerable。我考虑使用任何其他方法的唯一原因是

  • 我必须同时比较两个数字可索引序列
  • 我必须对循环内的数据应用一些复杂的变换,然后才能确定元素是否有效进行处理(在这种情况下,我会使用类似于你当前的方法,使用continue跳过无效的元素)

我已将此设置为社区维基,以防有人想要添加修改或进一步澄清OP

答案 1 :(得分:4)

如果在执行显示值的方法之前 ,则可以将count变量设置为零。

int count = 0;

foreach (string fullFileName in FileList)
{
    count++;
    // Run a method and report a result..
}

如果循环未执行,count将在0,您可以继续进行count == 0检查。

如果执行,它会立即增加到1,您将完成" 1)文件方法"第一个元素的消息。

所以基本上你的计数从0开始,但你的列表仍然会从你需要的1开始。

答案 2 :(得分:1)

您最初应该将计数设置为0吗?

int count = 0代替int count = 1

if (count == 0)
{
     Log("0 results found");
}

这就是为什么你总是显示文件存在,即使没有文件。

答案 3 :(得分:1)

你的问题的答案很简单......

您将计数开始为0.然后在foreach语句中,在处理并记录之前执行增量。

像这样:

int count = 0;
Log("| ", true);
Log("| Looping For Specific Criteria...", true);

// Loop through all files for condition
foreach (string fullFileName in FileList)
{
     count++
     // Now run the method Run a method and report a result..
}

if (count == 0) //This can now safely be 0 as you only increment if there is a file
{
     Log("0 results found");
}

答案 4 :(得分:1)

将一个变量用于多种目的通常不是一个好主意。在您的情况下,'count'已用于您的日志文件。您可以将它用于您描述的标记目的,但在2个月内您忘记了为什么用1初始化它以及您描述的可能的副作用。

但是我认为你想要使用count变量的方式会起作用。即使FileList中只有一个文件,在foreach循环之后count的值也是2,因为count在foreach中递增,因此

If (count==1)

将评估为false。如果循环从未执行过,它将只为1。

由于我之前所说的,我建议使用另一个布尔变量,该变量在循环之前用false初始化,并在foreach循环中设置为true。

答案 5 :(得分:0)

有趣的问题,我曾经使用脚本语言(ERPLN 4GL)和一个简洁的SELECT语法来流畅地运行数据库查询代码

def forwards(self, orm):
    # Changing field 'Unit.founders'
    db.alter_column('unit', 'founders', 
                    self.gf('django.db.models.fields.CharField')(
                        max_length=1000, null=True))

def backwards(self, orm):
    # Changing field 'Unit.founders'

    db.alter_column('unit', 'founders', 
                    self.gf('django.db.models.fields.CharField')(
                    max_length=250, null=True))

所以你要做到这一点

SELECT | Actual query that defines which table fields are selected.

SELECTDO | Operation(s) that are executed for each selected record.

SELECTEOS | Operation(s) that are executed after the last record was selected.

SELECTEMPTY | Operation(s) that are executed in case no record was selected.

SELECTERROR | Operation(s) that are executed in case an error has occurred.

ENDSELECT

我总是错过NET中的一些东西,但在阅读这篇文章之后,我整理了一个小帮手类,可以这样使用

SELECT * FROM products
WHERE product.category = 5
SELECTDO
    product.discontinued = 1
SELECTERROR
    message("Something went wrong")
SELECTEMPTY
    message("No products found")
ENDSELECT

这是代码

        var items = new[] { 1, 2, 3}.AsEnumerable();
        items.ForEach(x =>
        {
            if (x == 3) throw new ArgumentException("3 is a bad number");
            Console.WriteLine(x.ToString());
        }).OnError(ex =>
        {
            Console.WriteLine(ex.Message);
        }).IfEmpty(() =>
        {
            Console.WriteLine("Empty");
        }).Execute();