【问题标题】:Convert reading of delimited file from F# to C# [closed]将分隔文件的读取从 F# 转换为 C# [关闭]
【发布时间】:2013-11-06 23:13:10
【问题描述】:

我知道这是一个相当厚的问题,但我试图在 F# 和 C# 之间进行一些比较,并从 http://www.clear-lines.com/blog/post/Nearest-Neighbor-Classification-part-2.aspx 借用了一个 F# 脚本,并试图从 C# 程序中获取等效操作,目的是测试操作和语法。这部分位于一个较大的脚本中,我将其转换为一个 F# 程序,该程序对给定数据执行 k-means 分析。

这是 F# 部分:

let elections =
    let file = @"C:\Users\Deines\Documents\Election2008.txt"
    let fileAsLines =
        File.ReadAllLines(file)
            |> Array.map (fun line -> line.Split(','))
    let dataset =
        fileAsLines
        |> Array.map (fun line ->
            [| Convert.ToDouble(line.[1]);
               Convert.ToDouble(line.[2]);
               Convert.ToDouble(line.[3]) |])
    let labels = fileAsLines |> Array.map (fun line -> line.[4])
    dataset, labels 

这里是数据样本(Election2008.txt):

AL,32.7990,-86.8073,4447100,REP 
AK,61.3850,-152.2683,626932,REP 
AZ,33.7712,-111.3877,5130632,REP 
AR,34.9513,-92.3809,2673400,REP 
CA,36.1700,-119.7462,33871648,DEM 
CO,39.0646,-105.3272,4301261,DEM 
CT,41.5834,-72.7622,3405565,DEM 
DE,39.3498,-75.5148,783600,DEM 
DC,38.8964,-77.0262,572059,DEM 
FL,27.8333,-81.7170,15982378,DEM 

【问题讨论】:

  • familiarize yourself 了解本网站的运作方式。我们不是来执行通用代码翻译服务的。
  • 如果您要经常使用此类数据,请查看 F# 类型提供程序。有一个专门用于 CSV 数据。它可以解析输入数据,分析它,并为你生成类型。

标签: c# csv f# f#-data


【解决方案1】:

您可以通过以下方式在 C# 中执行相同的基本操作:

Tuple<double[][], string[]> GetElections()
{
    var file = @"C:\Users\Deines\Documents\Election2008.txt";
    var fileAsLines = File.ReadLines(file).Select(line => line.Split(','));
    var dataset = fileAsLines.Select(line => new[] 
                                             { 
                                                 Convert.ToDouble(line[1]),
                                                 Convert.ToDouble(line[2]),
                                                 Convert.ToDouble(line[3])
                                             }).ToArray();
    var labels = fileAsLines.Select(line => line[4]).ToArray();
    return Tuple.Create(dataset, labels);
}

话虽如此,C# 开发人员很少会以这种方式编写此代码。您更有可能创建一个自定义类型来保存结果(使用名称 + 值),并以这种方式读取它,即:

class ElectionResult
{
     public ElecationResult(string label, double x, double y, int amount)
     {
         this.Label = label;
         this.Point = new Point(x,y);
         this.Amount = amount;
     }
     string Label { get; private set; }
     Point Location { get; private set; }
     int Amount { get; private set; }
}

IList<ElectionResult> GetElectionResults()
{
    var file = @"C:\Users\Deines\Documents\Election2008.txt";
    var fileAsLines = File.ReadLines(file).Select(line => line.Split(','));

    return fileAsLines.Select(line => new ElectionResult(line[4],
                                                 Convert.ToDouble(line[1]),
                                                 Convert.ToDouble(line[2]),
                                                 Convert.ToInt32(line[3]))
                      .ToList();
}

这使得它对于典型的 C# 开发人员来说更加有用,因为没有模式匹配来从元组结果中提取数组。

【讨论】:

  • 你太棒了,谢谢你,这就是我想要的。我将在我的测试中运行它,看看我们如何进行。
  • 啊,你打败了我。不过,标签选择可能需要是 SelectMany。
  • @AlexBeisley 不应该 - 每行一个标签...
  • 哦,也可以考虑enum {DEM, REP, ...}
  • 但是说真的,为了你自己,请使用 F#
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多