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中实现这一点.
如果订单很重要,那么您可以将每个元素转换为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)