如何将`var`变量等同于另一个查询

Nol*_*esh 0 c# linq casting type-conversion

我有一个var名为retVal的变量,它等于某个查询.在一些条件之后,我想将它等同于另一个查询.但是我得到了一个错误implicit cast of type "System.Collections.Generic.IEnumerable<AnonymousType#1>" in "System.Collections.Generic.IEnumerable<AnonymousType#2>" is impossible.你可以问我为什么我不想定义另一个var变量.因为这个用于foreach循环.我们来看看代码:

var retVal = from groupItem in result.AsEnumerable()
                             where groupItem.Sms.First().amountOfParts == (
                               (from item in rawSmsList.AsEnumerable()
                                where item.referenceNumber == groupItem.Sms.First().referenceNumber
                                select item).Count()
                             )
                             select new
                             {
                                 Value = groupItem.Value,
                                 Sms = groupItem.Sms
                             };
                //CONDITION
                if (retVal.ToArray().Length==0)
                {
                    //HERE I NEED TO RETVAL EQUATE NEW QUERY
                    retVal = from groupItem in result.AsEnumerable()
                                 where groupItem.Sms.First().amountOfParts == (
                                   (from item in rawSmsList.AsEnumerable()
                                    where item.senderNumber == groupItem.Sms.First().senderNumber
                                    select item).Count()
                                 )
                                 select new
                                 {
                                     Value = groupItem.Value,
                                     Sms = groupItem.Sms
                                 };                        
                }

                foreach (var item in retVal)//FOREACH EXPECTS THE SAME RETVAL!!!
Run Code Online (Sandbox Code Playgroud)

那么如何将不同的查询转换为同一个var变量呢?或者如何找到var变量类型然后将其转换为新定义的变量?

Hab*_*bib 5

var 表示隐式类型变量,这意味着它的类型将在编译时确定,因此在您的第一次使用时,它将被分配一个匿名类型,在您的第二次尝试为其分配一个不同的匿名类型,您不能这样做.

您可以修改代码以使用类而不是匿名对象,然后投射到该代码,然后您将执行您现在正在执行的操作.您可以创建类如下:

public class MyClass 
{
   public int Value {get;set;}
   public string Sms {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

然后通过将select语句修改为:

var retVal = ......
             select new MyClass
               {
                  Value = groupItem.Value,
                   Sms = groupItem.Sms
               };  
Run Code Online (Sandbox Code Playgroud)