我是C#的新手,我正在尝试了解其他开发人员的代码 - 请参阅下文:
nameFile.ForEach(x =>
{
FileChecker singleFile = new FileChecker();
singleFile.FileName = x;
singleFile.FoundDT = DateTime.Now;
singleFile.IsData = this.IsData(singleFile.FileName);
singleFile.IsStore = this.IsStore(singleFile.FileName);
if (singleFile.IsData )
{
//...
}
});
以下是FileChecker
定义的代码片段:
public FileChecker()
{
this.fileDownloaded = false;
this.IsData = false;
this.IsStor = false;
}
public bool IsData { get; set; }
public bool IsStore { get; set; }
我有两个问题:
有人可以向我解释或指向一个解释这个foreach如何运作的链接吗?的ForEach(X => ...);
我不明白这句话(singleFile.IsData )
是如何运作的,因为定义只是:public bool IsData { get; set; }
换句话说,开发人员试图寻找什么? IsData是什么意思?他是否打算查看它是否符合标准(如文件名语法)?
答案 0 :(得分:4)
与
相同foreach (var x in nameFile)
{
...
}
IsData
是一个自动属性。查一查......
答案 1 :(得分:2)
=>
列表中的每个项目执行nameFile
之后的案例代码块中列表中每个项目执行的委托,以及x
将是一个项目变量。 您可能会找到有用的文章:“foreach” vs “ForEach”
答案 2 :(得分:2)
请参阅有关lambda表达式的这篇介绍文章:http://msdn.microsoft.com/en-us/library/bb397687.aspx
public bool IsData { get; set; }
是一个速记属性声明,类似于写作:
private bool _isData;
public bool IsData
{
get {return _isData;}
set {_isData = value;}
}
答案 3 :(得分:2)
x => ......被称为lambda表达式。 它只是说“对于每个元素,将其命名为'x'并将其传递给以下代码”。
解释得足够多,但值得指出的是,虽然写入要短得多,但您需要在构造函数中设置默认参数,而不是直接在成员字段上设置,因为您没有。您甚至可以将这个自动化属性与私有设置器一起使用。
答案 4 :(得分:1)
ForEach是extension method,是System.Linq的一部分(编辑:there is one in List,它接受一个Action,但System.Linq还有其他扩展名)。它在List上运行。 x => bit是lambda expression的一部分。
答案 5 :(得分:1)
上面回答了第一个问题,它只是一个lambda表达式,它带有需要在每次foreach迭代时执行的代码。
对于第二个问题,如果您正在寻找IsData属性的目的,请进入该类中的IsData方法(第一个代码块中的类)。