假设我有一个员工实例列表,employeeList
IEnumerator enumerator = employeeList.GetEnumerator();
while (enumerator.MoveNext())
{
Console.Write(enumerator.Current + " ");
}
Run Code Online (Sandbox Code Playgroud)
我有三个问题:
关于枚举器如何工作,我有一个很好的想法,就像C++中的迭代器一样.但是我不理解MoveNex方法(比如C++中的itr ++),因为它首先检查条件(是否在最后一个元素中),让我们说如果我们使用enumerator.Current来访问第一个元素,我认为它实际上当调用MoveNext()时,已经"移动"到列表中的下一个元素,因此当前指向的对象实际上是列表中的第二个元素?
我认为在使用enumerator.Current时我们可以访问当前元素是有意义的,例如,我们应该能够使用
enumerator.Current.name
就像我们可以在C++中使用(*itr).name或itr => name一样,但C#看起来并没有实现这种功能,那么使用enumerator.Current有什么意义呢?
IEnumerable<int> result = GetData() ?? Enumerable.Empty<int>;
作为C#的初学者,我只知道&&
,||
运营商,什么是" ??
"?
假设我有一个Employee类,GetAllEmployees()返回一个employee实例列表.我想按部门和性别对员工进行分组,所以答案就是
var employeeGroup = Employee.GetAllEmployees()
.GroupBy(x => new { x.Department, x.Gender }) // I don't understand this anonymous type
.OrderBy(g => g.Key.Department)
.ThenBy(g => g.Key.Gender)
.Select(g => new { //I can understand this anonymous type
Dept = g.Key.Department,
Gender = g.Key.Gender,
Employees = g.OrderBy(x => x.Name)
});
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
为什么匿名类型允许多个密钥组?
我不明白第一个匿名类型,因为根据我的理解,匿名类型的格式应该是这样的
new {field1 = x.Department,field2 = x.Gender}
为什么第一个匿名类型没有字段?我的意思是,写这样的东西是正确的语法:
var anonymous = new {field1 = 1,field2 =2}
Run Code Online (Sandbox Code Playgroud)
但如果我像这样写它会有编译错误:
var anonymous = new {1, 2} //compile error !!!
Run Code Online (Sandbox Code Playgroud) 假设我有一个方法接受一个对象的参数来打印一个数字:
object target = Console.ReadLine();
PrintNumber(target);
public void PrintNumber(object target)
{
int number = 0;
if(int.TryParse(target.ToString(), out number))
{
Console.WriteLine(number);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我只想使用:
Console.WriteLine((int)target);
Run Code Online (Sandbox Code Playgroud)
但它不起作用并抛出异常,为什么我们应该使用TryParse方法?