我有一个集合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"
};
以上两个列表的输出是
我的预期输出
我怎样才能达到上述List<dynamic>
的预期结果?列表是在运行时生成的,我无法更改结构。
这是复杂的Linq查询的一小部分,所以,我需要在Linq中实现这一点。
答案 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
展平它们,最后将所有字符串连接起来。