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

1 c# linq collections list dynamic

我有一个收藏品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"
};
Run Code Online (Sandbox Code Playgroud)

案例:2

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

以上两个列表的输出是

在此输入图像描述

我的预期输出是

在此输入图像描述

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

这是复杂的Linq查询的一小部分,因此,我需要在Linq中实现这一点.

RB.*_*RB. 5

如果订单很重要,那么您可以将每个元素转换为a 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");
    }
});
Run Code Online (Sandbox Code Playgroud)

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

dList.SelectMany(d => d as List<string> ?? new List<string>() { d })
Run Code Online (Sandbox Code Playgroud)

或者,最后,在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;
}
Run Code Online (Sandbox Code Playgroud)