小编gro*_*ine的帖子

使用IEnumerator迭代列表

假设我有一个员工实例列表,employeeList

IEnumerator enumerator = employeeList.GetEnumerator();
            while (enumerator.MoveNext())
            {
                Console.Write(enumerator.Current + " ");
            }
Run Code Online (Sandbox Code Playgroud)

我有三个问题:

  1. 关于枚举器如何工作,我有一个很好的想法,就像C++中的迭代器一样.但是我不理解MoveNex方法(比如C++中的itr ++),因为它首先检查条件(是否在最后一个元素中),让我们说如果我们使用enumerator.Current来访问第一个元素,我认为它实际上当调用MoveNext()时,已经"移动"到列表中的下一个元素,因此当前指向的对象实际上是列表中的第二个元素?

  2. 我认为在使用enumerator.Current时我们可以访问当前元素是有意义的,例如,我们应该能够使用

    enumerator.Current.name

就像我们可以在C++中使用(*itr).name或itr => name一样,但C#看起来并没有实现这种功能,那么使用enumerator.Current有什么意义呢?

  1. 这个问题与IEnumerator无关.我刚看到一些像这样的代码:

IEnumerable<int> result = GetData() ?? Enumerable.Empty<int>;

作为C#的初学者,我只知道&&,||运营商,什么是" ??"?

.net c#

12
推荐指数
2
解决办法
2万
查看次数

通过在Linq中使用匿名类型进行分组

假设我有一个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)

我有两个问题:

  1. 为什么匿名类型允许多个密钥组?

  2. 我不明白第一个匿名类型,因为根据我的理解,匿名类型的格式应该是这样的

    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)

.net c# linq

9
推荐指数
1
解决办法
5829
查看次数

C#中的类型转换不起作用

假设我有一个方法接受一个对象的参数来打印一个数字:

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方法?

c#

1
推荐指数
1
解决办法
113
查看次数

标签 统计

c# ×3

.net ×2

linq ×1