【问题标题】:Anonymous type broken after linq select [closed]linq select后匿名类型被破坏[关闭]
【发布时间】:2016-05-31 14:48:07
【问题描述】:

匿名类型有一个奇怪的问题。让我们直接进入我的代码:

var anon = new[] 
{
    new { Var1 = 20, Var2 = 40, Var3 = 70 },
    new { Var1 = 25, Var2 = 45, Var3 = 75 }
};

// found should be of type { int Var1, int Var2, int Var3 }
var found = anon.Select(x => x).Where(x => x.Var1 == 25);

var test = found.Var1 // <-- not defined error here

很简单的问题:
为什么我使用 linq select 后无法访问Var1

对不起这个话题,想不出更好的描述。

【问题讨论】:

  • 在这种情况下,编译器必须生成一条错误消息,解释为什么Var1 不可用
  • 我犯的愚蠢错误。甚至不能删除,因为已经有答案了。
  • 仅供参考。 Select(x =&gt; x) 这里不需要(或者真的不需要)。
  • 短版:var found = anon.First(x =&gt; x.Var1 == 25);
  • @C4ud3x 您唯一需要它的时候是您将查询实际投影到不同的Select(x =&gt; x.Something),或者您正在使用查询语法from x in stuff where x.Y = 1 select x;

标签: c# linq anonymous-types


【解决方案1】:

因为Where 返回您IEnumerable&lt;&gt;,而不是单个元素。 您可以使用FirstFirstOrDefault 来获取第一个元素。

found.First().Var1

【讨论】:

  • 哦,哈哈,我很愚蠢。当然,可能有多个结果。 >.<.>
【解决方案2】:

Where 返回 IEnumerable 并用于 0-n 个结果。

如果你总是有 1 个你想要的结果Single

如果你想要SingleOrDefault 得到 0-1 个结果。

如果您需要 First 得到 1-n 个结果。

如果你想要FirstOrDefault 得到 0-n 个结果。

【讨论】:

  • 我猜是瓦伦丁。无论如何,我赞成提供详细信息。谢谢。
【解决方案3】:

我在这台机器上没有 C# 编译器,但可能是因为 found 是 anonymus 类型的 Iterable。尝试使用anon.Select(x =&gt; x).Where(x =&gt; x.Var1 == 25).First()anon.Select(x =&gt; x).Where(x =&gt; x.Var1 == 25).FirstOrDefault()。另外,我很确定您不需要选择,您可以使用anon.Where(x =&gt; x.Var1 == 25).First()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多