Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当变量在C中定义匿名类时,如何在块外声明变量_C# - Fatal编程技术网

C# 当变量在C中定义匿名类时,如何在块外声明变量

C# 当变量在C中定义匿名类时,如何在块外声明变量,c#,C#,我有以下代码,它运行良好: var _data = (from qu in _que.GetAll( u => u.company == "GE" ) select new { qu.name, qu.address }); GetALL方法的签名是 ICollection<T> GetAll(Expression<Func<T, bool>> predicate); 现在,我需要将上面的内容包含在某个块中,使其成为: {

我有以下代码,它运行良好:

var _data = (from qu in _que.GetAll(
  u => u.company == "GE" )
  select new {
    qu.name,
    qu.address
});
GetALL方法的签名是

ICollection<T> GetAll(Expression<Func<T, bool>> predicate);
现在,我需要将上面的内容包含在某个块中,使其成为:

{
    var _data = (from qu in _que.GetAll(
      u => u.company == "GE" )
      select new {
        qu.name,
        qu.address
    });
}
var _abc = _data; <<< doesn't work now

一旦我这样做了,那么_数据就变成了本地数据,我无法从块外访问它。我假设我需要做的是在块之外声明_数据。但是我也要声明什么,因为它们返回并放入的类型是匿名类型。有什么方法可以在不改变查询或填写某种返回类型的情况下声明_数据吗?

您的问题不清楚,但我想我大致理解。就我个人而言,我尽量避免要求这样做,但您可以这样做:

// I'm assuming name and address are strings
var _data = Enumerable.Repeat(new { name = "", address = "" }, 0);
_data = null; // Never actually want to use that value

if (someCondition)
{
    _data = from qu in _que.GetAll(u => u.company == "GE")
            select new { qu.name, qu.address };
}
只要您使用相同的属性名称和类型,这里的两个匿名类型将是等效的,因此您可以毫无问题地执行第二个赋值。请注意,我已经更改了查询表达式的格式-我相信这看起来更清晰,因为之前它看起来像GetAll参数是查询表达式本身的一部分

考虑到您的查询表达式只是一个单选表达式,我可能会写:

_data = _que.GetAll(u => u.company == "GE")
            .Select(qu => new { qu.name, qu.address });

至少使用Resharper,如果您不介意丢失var,可以快速将其更改为显式类型声明,然后将其移动到外部范围。只需点击几下。但我同意Marc和Jon的观点,我经常遇到这种情况,而且常常很混乱。

取决于周围的代码,但您可以将选择延迟到块之后

ICollection<SomeType> _data = null;
...
{
    _data = _que.GetAll(u => u.company == "GE");
}
...
var _abc = from qu in _data select new { qu.name, qu.address };

你好,基伦,我不知道resharper的事。你能解释一下这对我有什么好处吗?当然,我不介意丢失var。我只想要一些运行良好的东西。它是Visual Studio的生产力/代码重构/etc加载项。但这不是免费的。使用它,您可以将光标放在_数据上,单击重构图标,选择“更改为显式类型…”选项,然后再次执行相同操作,但选择“移动到外部范围”。还有其他的免费工具可以做到这一点吗?我对任何工具都不熟悉:谢谢Jon。你的答案看起来很好,尽管我希望有一种非常简单的方法,不需要我创建另一个类似匿名类的类。也谢谢你的重写技巧。Jon@-我可以为这个选择声明一个类,然后编写选择新类吗{…等等。如果我这样做了,那么声明变量_data会更容易吗?@Robert:是的,那是另一种选择。我还要求提供命名匿名类的功能,给我一个具有适当属性、相等性等的不可变类。也许有一天:既然var是一个编译时构造,我不明白为什么它不应该是pos可以在这样的范围外声明var_数据并在其中赋值。如果用户尝试有条件地分配不同的对象,则可能会出现错误,但这可以检查或警告。var的类型仍然可以从任何第一个潜在赋值推断出来。有人同意吗?