3 回答

TA貢獻1821條經驗 獲得超5個贊
第一步,您必須將數據標準化為一種類型。然后你可以隨意迭代它們。因此,首先創建一個方法來將特定點的值展平到任意深度:
public static class Extensions
{
public static IEnumerable<object> FlattenArrays(this IEnumerable source)
{
foreach (var item in source)
{
if (item is IEnumerable inner
&& !(item is string))
{
foreach (var innerItem in inner.FlattenArrays())
{
yield return innerItem;
}
}
yield return item;
}
}
}
現在您可以在頂層進行迭代以獲得所有值的單個數組:
// Produces one array => ["1", "2", "3", "4", ...]
var allFlat = schools.FlattenArrays().OfType<string>().ToArray();
或者您可以創建更深一層的單個數組:
foreach (var item in schools)
{
// Produces an array for each top level e.g. ["5", "6", "7", "8"]
var flat = item.FlattenArrays().OfType<string>().ToArray();
}

TA貢獻1780條經驗 獲得超1個贊
根據評論,由于您的內部數組混合了 and 的元素string[],string因此直接在 Linq 中執行此操作可能并非易事。
但是,在輔助函數(我稱為Flattener)的幫助下,您可以手動對兩種內部類型的處理進行分支,以返回數組中的元素(如果是string[]),或者將單個元素作為可枚舉返回,如果不是。SelectMany然后可用于展平內部級別,但您似乎希望保持外級別不展平:
IE
var schools = new [] {
new object[]{new[]{"1","2"}, "3","4"},
new object[]{new[]{"5","6"}, "7","8"},
new object[]{new[]{"9","10","11"}, "12","13"}
};
var result = schools
.Select(s => s.SelectMany(o => Flattener(o)));
它返回一種類型IEnumerable<IEnumerable<string>>
凌亂的拆包位由以下人員完成:
public IEnumerable<string> Flattener(object o)
{
if (o is IEnumerable<string> strings)
{
return strings;
}
if (o is string s)
{
return new[]{s};
}
return new[]{"?"};
}
請注意,上面使用了 C#7 的模式匹配功能。
結果截圖由 LinqPad 提供:

TA貢獻1829條經驗 獲得超6個贊
如果你想通過 linq 來做,這里有一個示例
var schools = new[] {
new object[]{new[]{"1","2"}, "3","4"},
new object[]{new[]{"5","6"}, "7","8"},
new object[]{new[]{"9","10","11"}, "12","13"}
};
var result = schools.Select(z => z.SelectMany(y=> y.GetType().IsArray ? (object[])y : new object[] { y }));
- 3 回答
- 0 關注
- 183 瀏覽
添加回答
舉報