使用linq从逗号分隔的字符串中的对象

时间:2014-02-13 16:36:30

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

最后开始学习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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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在下面显示“流畅”的方式,这是查询版本,我认为这样可以更容易地看到wat正在进行。< / p>

享受您的LINQ之旅!

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