我有一个运行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开始。
......等等
我以为我可以使用我的int值来确定计数是否已经改变但问题是,count
整数始终至少保持值为1并且运行我的if语句也会抛出“找到0个结果“如果在foreach
循环中只处理了1个文件,则显示”消息。
有什么想法吗?
答案 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();