为什么一个lamba表达式与运算符一起工作而不是另一个

时间:2016-01-25 07:16:55

标签: c# lambda operators

我有一个名为dataGrid的数据网格的WPF项目。

我正在做一些测试,看看lambda表达式和运算符是如何工作的。

以下是我的表格中的数据:

enter image description here

我不明白为什么会这样:

this.dataGrid.ItemsSource = (from em in context.tUsers
                             select new { em.name }).ToList();

这将在数据网格中显示正确的名称。它看起来像这样: enter image description here

但如果我喜欢.codeproject.com上的教程:

this.dataGrid.ItemsSource = (from em in context.tUsers
                             select em.name).ToList();

这将只显示一些整数而不是名称。我不知道为什么。 enter image description here

所以我猜第一个会创建一个匿名对象并将em.name放入其中。但我不明白一个人会工作,而不是另一个。

我特别感兴趣的是它显示那些整数的原因。

无论如何可以解释一下?

PS:我刚注意到整数实际上是字符串的长度。我不知道为什么。

3 个答案:

答案 0 :(得分:1)

您正在混合使用2种语法:

this.dataGrid.ItemsSource = (from em in context.tUsers
                         select new { em.name }).ToList();

它将创建一个字符串列表(即您要查找的名称)

而且:

this.dataGrid.ItemsSource = (from em in context.tUsers
                         select em).ToList();

它将创建一个对象“employee”的列表。

修改: 默认情况下,DataGrid会自动生成给定项类的列,因此它将搜索String类中可以转换为列的属性。所以这里显示了string.Length。 因此,您需要创建自己的列并关闭AutoGenerateColumns。示例:

<DataGrid Name="MainGrid" ... AutoGenerateColumns="False" ItemsSource="{Binding}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="name" Binding="{Binding}"/>
    </DataGrid.Columns>
</DataGrid>

答案 1 :(得分:1)

网格显示您传递给它的可枚举类型的每个非索引器属性的列。

在第一种情况下,您传递一个匿名类型的列表,该列表具有单个name属性,这是一个字符串,因此它显示一个名为name的列并显示这些字符串。

在第二种情况下,您传递一个字符串列表,并且字符串只有一个Length属性,因此它会创建一个名为Length的列,并显示这些长度。

答案 2 :(得分:0)

this.dataGrid.ItemsSource = (from em in context.tUsers
                         select em.name).ToList();

这将返回一个字符串列表,而另一个将选择一个具有name属性的匿名类型列表。

它显示每个String的长度,为什么它默认为这种行为,我不知道。