【问题标题】:LINQ Cannot assign void to Implicitly Typed variableLINQ 无法将 void 分配给隐式类型变量
【发布时间】:2017-08-18 08:03:29
【问题描述】:

我正在尝试借助 LINQ 将这组数据转换为一个对象,但出现此错误:

无法将 void 分配给隐式类型变量

我可以理解我必须使用Select() 函数,但我不知道该怎么做。

数据集:

[Zip]   [Fips]  [County]    [StateAbbr] [StateName]
90210   12345   County1     CA      California
90210   12346   County2     CA      California
90210   12347   County3     CA      California
90210   12348   County4     CA      California

代码片段:

 var zipInfo = results.ForEach(z => new ZipInfoEntity{
        Zip = z.Zip,
        StateName = z.StateName,
        StateAbbr = z.StateAbbr,
        FipsCountyInfo = new List<FipsCountyInfoEntity>{
            new FipsCountyInfoEntity {
                Fips = z.Fips,
                County = z.County
            }
        }
    });

public ZipInfoEntity
{
    public string Zip {get;set;}
    public string StateName {get;set;}
    public string StateAbbr {get;set;}
    public IList<FipsCountyInfoEntity> FipsCountyInfo {get;set;}
}

public FipsCountyInfoEntity
{
    public string Fips {get;set;}
    public string County {get;set;}
}

我最终想要实现的是 ZipInfoEntity 的对象。 如果您将看到我的数据集,它的 Zip、StateAbbr 和 StateName 对所有行都相同。县和 Fips 正在发生变化。

所以我的最终对象应该是这样的

{
   Zip: "90210",
   StateAbbr: "CA",
   StateName: "California",
   FipsCountyInfo: [
        {Fips: "12345", County: "County1"}, 
        {Fips: "12346", County: "County2"},
        ...]
}

【问题讨论】:

  • 你能澄清一下你最终的对象结构是什么样的吗?是否应该有一个包含多个县信息对象列表的 zip 信息实体,还是您确实希望数据集的每一行都有一个 zip 信息实体?
  • @Chris 更新问题。
  • 所以你需要使用GroupBy 而不是任何选择或其他任何东西
  • @m.rogalski 你能帮我解决这个问题吗?
  • 我假设您可以保证只有 Fips 和 County 会改变,而其他字段在行之间会相同?

标签: c# linq


【解决方案1】:

首先,ForEach 返回void,而您正试图将其分配给某个在 C# 中无法执行的变量。

所以开始你应该有这样的东西:

var zipInfo = results.Select(z => new ZipInfoEntity{
    Zip = z.Zip,
    StateName = z.StateName,
    StateAbbr = z.StateAbbr,

在这里,您尝试将 FipsCountyInfoEntity 类型的对象分配给 FipsCountyInfoEntity ( IList&lt;FipsCountyInfoEntity&gt; ) 的集合。而你应该分配新的集合:

    FipsCountyInfo = new List<FipsCountyInfoEntity>(new FipsCountyInfo[] { 
        new FipsCountyInfoEntity{
            Fips = z.Fips,
            County = z.County
        }
    }
});

或者将该属性更改为 FipsCountyInfoEntity 类型并像您一样使用它:

    FipsCountyInfo = new FipsCountyInfoEntity{
        Fips = z.Fips,
        County = z.County
    }
});

编辑:
如评论中所述,要仅检索一个元素,您可以在末尾使用FirstOrDefault() Linq 方法,例如。 :

var zipInfo = results.Select(z => new ZipInfoEntity{
    // ... same code as above
}).FirstOrDefault();

或者:

var zipInfo = results.FirstOrDefault(z => new ZipInfoEntity{
    // ... same code as above
    return true; // needs to return true on object you want to return
});

EDIT2:
要仅使用 FipsCountyInfoEntity 集合获取一个元素,我建议您执行以下操作:

var zipInfo = results.Select(e => new ZipInfoEntity 
    {
        Zip = z.Zip,
        StateName = z.StateName,
        StateAbbr = z.StateAbbr,
        FipsCountyInfo = results.Select(z => new FipsCountyInfoEntity
        {
            Fips = z.Fips,
            County = z.County
        }
    }).FirstOrDefault();

或者使用GroupBy

var zipInfo =  results.GroupBy(e => new { e.Zip, e.StateName, e.StateAbbr }).Select(e => new ZipInfoEntity
        {
            Zip = e.Key.Zip,
            StateName = e.Key.StateName,
            StateAbbr = e.Key.StateAbbr,
            FipsCountyInfo = e.Select(c => new FipsCountyInfoEntity
            {
                Fips = c.Fips,
                County = c.County
            }).ToList()
        });

【讨论】:

  • 这将返回 IEnumerable 但我只想要带有 List 的 ZipInfoEntity 对象
  • @siddharth 我已经编辑了我的答案,应该正是你指定的。
【解决方案2】:

ZipInfoEntity 中的属性FipsCountyInfo 应该这样声明。

public ZipInfoEntity
{
    public string Zip {get;set;}
    public string StateName {get;set;}
    public string StateAbbr {get;set;}
    public FipsCountyInfoEntity FipsCountyInfo {get;set;} // <-- use class, not IList
}

【讨论】:

    【解决方案3】:

    您需要正确设置您的 FipsCountryInfo 列表。 FipsCountyInfo 是 FipsCountyInfoEntity 的列表,您正在尝试将 FipsCountyInfoEntity 对象分配给列表。

    你需要替换这段代码:

    FipsCountyInfo = new FipsCountyInfoEntity{
        Fips = z.Fips,
        County = z.County
    }
    

    有了这个:

    FipsCountyInfo = new  List<FipsCountyInfoEntity>(){ new FipsCountyInfoEntity{
        Fips = z.Fips,
        County = z.County
    }}
    

    【讨论】:

      【解决方案4】:

      你应该这样做:

      var output = new ZipInfoEntity
      {
          Zip = results.First().Zip,
          StateName = results.First().StateName,
          StateAbbr = results.First().StateAbbr,
          FipsCountyInfo = new List<FipsCountyInfoEntity>( 
              results.Select(z=>
                  new FipsCountyInfoEntity {
                      Fips = z.Fips,
                      County = z.County
                  }
              )
          )
      }
      

      results.First() 只是获取列表中的第一项。我们使用它是因为我们可以从第一个对象中获取前三个字段。然后在创建 FipsCountyInfo 列表时,我会遍历您的结果集,为每个条目构造一个对象。

      应该注意的是,这假设ZipStateNameStateAbbr 在所有行中都是相同的。如果不是(即您在结果集中有多个 zip 的详细信息),那么这将产生意想不到的结果,您需要使用 group by 来从结果中获取 IEnumerable&lt;ZipInfoEntity&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 2016-12-24
        相关资源
        最近更新 更多