将自定义分隔的字符串转换为List <myclass>?</myclass>

时间:2013-07-18 14:57:47

标签: c# linq

我该怎么做:

string x = "key:value|key:value|key:value|key:value";

进入这个?

List<myClass> listObj;

myClass定义:

public class myClass
{
    public string keyName { get; set; }
    public string keyValue { get; set; }
}

必须有一种方法可以使用LINQ或其他东西:) 提前谢谢!

*注意* 我应该添加我知道如何分割它并循环它,但必须有一个更好的方法:)

3 个答案:

答案 0 :(得分:10)

这需要单独的ToList()调用,但我喜欢其声明性质的查询语法:

from s in x.Split('|')
let parts = s.Split(':')
select new myClass { 
    keyName = parts[0], 
    keyValue = parts[1] 
}

或者你可以使用流利的语法:

x.Split('|')
 .Select(s => {
    var parts = s.Split(':');
    return new myClass { 
        keyName = parts[0], 
        keyValue = parts[1] 
    };
 }).ToList()

答案 1 :(得分:0)

如果您更喜欢使用自定义类而不是词典

,请执行此操作
 var result = from y in x.Split('|')
             let obj = y.Split(':')
             select new myClass{keyName = obj[0], keyValue = obj[1]};

 var list = result.ToList();   

答案 2 :(得分:0)

好吧,既然你真的想避免分裂和循环......

public List<MyClass> Parse(string base, string workingName, string workingValue,
                           bool processingName = true, 
                           List<MyClass> workingList = null, int index = 0)
{
    if (workingList == null)
        workingList = new List<MyClass>();

    if (index >= base.Length)
    {
        return workingList;
    }
    if (base[index] = '|')
    {
        workingList.Add(new MyClass { keyName = workingName, keyValue = workingValue });
        return Parse(base, "", "", true, workingList, index + 1);
    }
    else if (base[index] = ':')
    {
        return Parse(base, workingName, "", false, workingList, index + 1);
    }
    else if (processingName)
    {
        return Parse(base, workingName + base[index], "", processingName, workingList, index + 1);
    }
    else
    {
        return Parse(base, workingName, workingValue + base[index], processingName, workingList, index + 1);
    }
}

但请,为了爱你所珍爱的任何东西,不要做任何甚至远远类似的事情(是的,这是未经测试的,手写的代码,所以可能有错误 - 只是开个玩笑来避免事情)。