Linq 如何预定义将包含匿名类型的变量?

Linq 如何预定义将包含匿名类型的变量?,linq,c#-4.0,Linq,C# 4.0,在下面的简化示例中,我想在分配结果之前定义它。下面的linq查询返回匿名类型的列表。linq查询的结果将以IEnumerable形式出现您可以将其设置为IEnumerable,只需在查询中选择“n”,而不是创建匿名类型。例如: IEnumerable<int> result = null; result = from n in numbers where n > 5 select n; 如果您实际执行的操作需要匿名类型,那么由于您使用的是

在下面的简化示例中,我想在分配结果之前定义它。下面的linq查询返回匿名类型的列表。linq查询的结果将以IEnumerable形式出现您可以将其设置为IEnumerable,只需在查询中选择“n”,而不是创建匿名类型。例如:

IEnumerable<int> result = null;

result = from n in numbers
         where n > 5
         select n;

如果您实际执行的操作需要匿名类型,那么由于您使用的是C4,您可以声明IEnumerable结果,其余代码将正常工作。

您必须事先定义类型。例如

public class TheNumber
{
  public int Number { get; set; }
}


匿名类型只能用var声明。好的是,具有相同属性的匿名类型将是相同的类型。如果您在本示例中确实需要它,您不需要它,那么您可以写:

var result = Enumerable.Repeat(new {value = 0}, 0); // stub value which will give needed type
if (...)
{
    result = ...;
}
else
{
    result = ...;
}

附言:即使在低于4.0的早期.Net版本中,这也是可能的,如果你真的要这么做的话,我喜欢雪熊的回答。。。但就我个人而言,我至少会尽量避免陷入这种情况。例如,即使保留匿名类型,我也会将您的原始代码更改为:

bool large = true;
var result = new IEnumerable();   //This is wrong

List<int> numbers = new int[]{1,2,3,4,5,6,7,8,9,10}.ToList<int>();

Func<int, bool> predicate = large ? new Func<int, bool>(x => x > 5)
                                  : x => x < 5;
var result = numbers.Where(predicate)
                    .Select(x => new { value = x });

foreach (var num in result)
{
    Console.WriteLine(num.value);
}
请注意,这是如何消除重复的——更清楚的是,影响较大的惟一因素是谓词

我发现,如果变量只分配了一个值,那么代码最终会更清晰,最好是在声明的时候


显然,这并不总是可行的,但在可能的情况下值得记住。在不可能的情况下,Snowbear的答案是很好的,并且保证可以工作。

如果在创建匿名类型后不需要任何条件部分,则可以部分构建LINQ查询。否则,定义一个新的结构/类来代替匿名类型可能更明智

bool large = true;
List<int> numbers = new int[]{1,2,3,4,5,6,7,8,9,10}.ToList<int>();

IEnumerable<int> query;
if (large) {
    query = query.Where(n => n > 5);
} else {
    query = query.Where(n => n < 5);
}

var result = query.Select(n => new { Value = n });

foreach (var num in result) {
    Console.WriteLine(num.Value);
}

这并不能回答问题-这不是匿名类型我认为示例代码旨在说明目标。如果不去想,这绝对是最好的方式!他在这个例子中所做的并不需要匿名类型,但是如果他确实需要IEnumerable,那么使用IEnumerable应该是可行的。但是使用dynamic还有很多其他缺点,与其他强类型选项相比。是的,在这个非常简单的示例中,这将起作用,但我的目的是想知道是否可以预定义一个包含匿名类型的变量。谢谢。请注意,这是相同的属性名称,具有相同的属性类型,以相同的顺序。是的,这是有效的,正是我所寻找的。谢谢
bool large = true;
var result = new IEnumerable();   //This is wrong

List<int> numbers = new int[]{1,2,3,4,5,6,7,8,9,10}.ToList<int>();

Func<int, bool> predicate = large ? new Func<int, bool>(x => x > 5)
                                  : x => x < 5;
var result = numbers.Where(predicate)
                    .Select(x => new { value = x });

foreach (var num in result)
{
    Console.WriteLine(num.value);
}
bool large = true;
List<int> numbers = new int[]{1,2,3,4,5,6,7,8,9,10}.ToList<int>();

IEnumerable<int> query;
if (large) {
    query = query.Where(n => n > 5);
} else {
    query = query.Where(n => n < 5);
}

var result = query.Select(n => new { Value = n });

foreach (var num in result) {
    Console.WriteLine(num.Value);
}