【问题标题】:LINQ query on DataTable AsEnumerable returns nullDataTable AsEnumerable 上的 LINQ 查询返回 null
【发布时间】:2019-11-18 19:45:05
【问题描述】:

在下面的代码块中,我的DataTable TelemetryFile 已正确填充。第一个 MessageBox 显示 4。

它还正确地包含一个名为 FixName 的列。第二个 MessageBox 显示 FixName。

但是,当我尝试创建表中不同 FixName 值及其出现频率的 List 时,出现了问题。 sortedCountsByName 为 null,第三个 MessageBox 显示 Hmm。

我做错了什么?


    public List<(string FixOrReportName, long CountInTelemetryFile)> GetMostPopularOptionsFromTelemetryFile(string typeToReturn, int maxOptionsToReturn)
    {
        this.TelemetryFile.DefaultView.RowFilter = "FixOrReport = '" + typeToReturn + "'";
        MessageBox.Show(this.TelemetryFile.DefaultView.Count.ToString());
        MessageBox.Show(this.TelemetryFile.Columns[3].ColumnName);

        var sortedCountsByName = (
            this.TelemetryFile.AsEnumerable()
           .GroupBy(x => x.Field<string>("FixName"))
           .Select(x => new Tuple<string, long>(x.Key, x.Count()))
        ) as List<(string FixOrReportName, long CountInTelemetryFile)>;

        if (sortedCountsByName is null)
        {
            MessageBox.Show("Hmm");
            return null;
        }
        else
        {
            sortedCountsByName.Sort(
                delegate (
                    (string FixOrReportName, long CountInTelemetryFile) firstPair,
                    (string FixOrReportName, long CountInTelemetryFile) nextPair)
                {
                    return -1 * firstPair.CountInTelemetryFile.CompareTo(nextPair.CountInTelemetryFile);
                }
            );
        }

        return sortedCountsByName.Take(maxOptionsToReturn).ToList();
    }

【问题讨论】:

  • 您将旧的 Tuples 与新的 C#7 值元组混合在一起。删除as 转换并从那里继续。
  • @GertArnold 出于好奇,有没有办法让我在 LINQ 查询中使用新的 C#7 元组?我尝试了几件事,但无法成功。
  • @puzzlepiece87 随便Select(x =&gt; (x.Key, x.Count())
  • @juharr 我听从了你的建议,尽管使用Convert.ToInt64(x.Count()) 来使类型匹配。不幸的是,仍然返回 null。

标签: c# linq


【解决方案1】:
 .Select(x => new Tuple<string, long>(x.Key, x.Count()))

那是旧的Tuple 语法。

对于 C# 7 值元组,它应该是:

.Select(x => (FixOrReportName: x.Key, CountInTelemetryFile: (long)x.Count())

添加ToList(),可以去掉as的转换。

【讨论】:

  • 这很可能是正确的,但是当我之前和现在尝试过时,它说:`new 不能与元组类型一起使用。请改用元组文字表达式。我正在使用 VS 2019 和一个针对 .Net Framework 4.7.2 的项目,所以我相信我在 C#7.3 上,如果有帮助的话。
  • 您的编辑解决了编译错误,谢谢。我会再次运行它并接受它是否有效。
【解决方案2】:

问题在于这个as

.Select(x => new Tuple<string, long>(x.Key, x.Count()))
        ) as List<(string FixOrReportName, long CountInTelemetryFile)>;

Select() 将返回 IEnumerable&lt;Tuple&lt;string,int&gt;&gt; 而不是 List&lt;T&gt;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 2010-11-06
  • 2018-03-05
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多