使用LINQ将List <dynamic>转换为List

时间:2016-03-30 09:09:22

标签: c# linq list dynamic collections

我有一个集合List<dynamic> dList。在那里,它有string项和List<string>项。现在我需要在一个List中组织所有值。

只需参考List<dynamic> dList

即可

案例:1

List<dynamic> dList = new List<dynamic>()
{
    "Selva",
    new List<string>() {"Bala"},
    new List<string>() {"Prayag", "Raj"},
    "Pavithran"
};

案例:2

List<object> bala = new List<dynamic>()
{
    "Selva",
    new List<object>() {"Bala"},
    new List<object>() {"Prayag", "Raj"},
    "Pavithran"
};

以上两个列表的输出是

enter image description here

我的预期输出

enter image description here

我怎样才能达到上述List<dynamic>的预期结果?列表是在运行时生成的,我无法更改结构。

这是复杂的Linq查询的一小部分,所以,我需要在Linq中实现这一点。

2 个答案:

答案 0 :(得分:5)

如果订单很重要,那么您可以将每个元素转换为List<string>,然后将其展平:

List<dynamic> dList = new List<dynamic>()
{
    "Selva",
    new List<string>() {"Bala"},
    new List<string>() {"Prayag", "Raj"},
    "Pavithran"
};

var flattenedList = dList.SelectMany(d => 
{
    if (d is string) 
    {
        return new List<string>() { d };
    }
    else if (d is List<string>)
    {
        return (d as List<string>);
    }
    else 
    {
        throw new Exception("Type not recognised");
    }
});

或者,作为一个没有类型检查的性感单行(所以...使用风险自负!)

dList.SelectMany(d => d as List<string> ?? new List<string>() { d })

或者,最后,在LINQ语法中:

var newList = 
    (from d in dList
    from d2 in EnsureListOfString((object)d)
    select d2
    );

public List<string> EnsureListOfString(object arg) 
{
    List<string> rtn = arg as List<string>;

    if (rtn == null) 
    {
        if (arg is string)
        {
            rtn = new List<string>() { arg as string };
        }
        else 
        {
            throw new Exception("Type not recognised.");
        }
    }

    return rtn;
}

答案 1 :(得分:1)

如果元素的顺序不重要,您可以这样做:

dList.OfType<string>().Concat(dList.OfType<List<string>>().SelectMany(l => l));

首先从列表中选择所有string元素,然后选择所有List<string>元素并使用SelectMany展平它们,最后将所有字符串连接起来。