【问题标题】:Object from comma separated string using linq [closed]使用 linq 来自逗号分隔字符串的对象 [关闭]
【发布时间】:2014-02-13 16:36:30
【问题描述】:

终于开始学习 LINQ。我想将字符串转换为对象。我知道还有其他方法,但我想看看它是如何使用 LINQ 完成的。这是我想出的最好方法:

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string [] lines = new string[2];
        lines[0] = "John, 12345, true";
        lines[1] = "Miles, 45678, true";

        var o = from x in lines
                select new {
                    name = x.Split(',')[0],
                    zip  = Int32.Parse(x.Split(',')[1]),
                    status = bool.Parse(x.Split(',')[2])
                };
        foreach (var p in o) {
            Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status);
        }
    }
}

我的问题是:有没有更好的方法不使用所有Split()s?这是一个小提琴:http://dotnetfiddle.net/RSY48R

【问题讨论】:

标签: c# linq csv linq-to-objects


【解决方案1】:
var query = lines.Select(r => r.Split(','))
                   .Select(t => new
                       {
                           name = t[0],
                           zip = int.Parse(t[1]),
                           status = bool.Parse(t[2])
                       });
foreach (var p in query)
{
    Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status);
}

你会得到:

John - 12345, - True
Miles - 45678, - True

【讨论】:

  • 我会投票支持 let 子句,这是一种更简洁的方式
【解决方案2】:
using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string [] lines = new string[2];
        lines[0] = "John, 12345, true";
        lines[1] = "Miles, 45678, true";

        var o = from x in lines
                let eachLine = x.Split(',')
                select new {
                    name = eachLine[0],
                    zip  = Int32.Parse(eachLine[1]),
                    status = bool.Parse(eachLine[2])
                };
        foreach (var p in o) {
            Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status);
        }
    }
}

我一直认为let 在这里总是更干净。除了split,我认为没有更好的方法,我觉得还可以。

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        string [] lines = new string[2];
        lines[0] = "John, 12345, true";
        lines[1] = "Miles, 45678, true";

        var o = from line in 
                    (
                        from inner in lines
                        select inner.Split(',')
                    )
                select new {
                    name = line[0],
                    zip  = Int32.Parse(line[1]),
                    status = bool.Parse(line[2])
                };
        foreach (var p in o) {
            Console.WriteLine(p.name + " - " + p.zip + ", - " + p.status);
        }
    }
}

另一种方法是使用内部选择 @Habib 在下面显示了执行此操作的“流畅”方式,这是查询版本,我认为它可以更容易地看到正在发生的事情。

享受您的 LINQ 之旅吧!

如果您能获得 Jon Skeet 的 'C# In Depth' 的副本,那么关于 LINQ 的部分绝对精彩。和本书的其余部分一样。

【讨论】:

  • 你可以嵌套选择而不是使用let,这样会更简洁
  • 反对者,你能详细说明一下吗?
  • @Tarec,我在上面的评论中做了
  • @NewHire 您对一个好的答案投了反对票,因为还有其他解决问题的方法?这不是投票系统在 SO 上的工作方式。否决按钮显示“这个答案没有用”。这个答案怎么没用?
  • Let 应该用在不可避免的情况下,我不认为这是一个适合这种情况的地方。只是似乎不是一个好习惯。对于尝试学习 LINQ 的人来说,这可能会导致他们不必要地使用 let
猜你喜欢
  • 1970-01-01
  • 2013-09-30
  • 2021-02-17
  • 2015-07-25
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多