亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何展平一組數組?

如何展平一組數組?

C#
心有法竹 2022-06-12 14:31:17
我有一個由以下元素組成的數組: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" }};我試圖展平的真正對象是將數據從 CSV 導入數組數組,然后將其加入字段值:    var q =        from c in list        join p in vocatives on c.Line[name1].ToUpper() equals p.first_name.ToUpper() into ps        from p in ps.DefaultIfEmpty()        select new object[] { c.Line,  p == null ? "(No vocative)" : p.vocative, p == null ? "(No sex)" : p.sex }; 我想展平該字符串數組以獲得:string[] {    new string[]{ "1","2","3","4" },    new string[]{ "5","6","7","8" },    new string[]{ "9","10","11","12","13" }}我已經有一個可以循環執行此操作的解決方案,它在性能方面并不那么明智,但它似乎工作正常。我嘗試使用SelectMany但無法提出解決方案。非常感謝您的反饋;)我嘗試過 npo 的回答:var result = schools.Select(z => z.SelectMany(y=> y.GetType().IsArray            ? (object[])y : new object[] { y }));但是 CSVwriter 類方法只接受顯式類型:IEnumerable<string[]>那么如何在linq中做到這一點,我試圖:List<string[]> listOflists = (List<string[]>)result;InvalidCastException但不幸的是,沒有去,出現了。
查看完整描述

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();

}


查看完整回答
反對 回復 2022-06-12
?
慕神8447489

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 提供:

http://img1.sycdn.imooc.com//62a5885d0001fe5903310366.jpg

查看完整回答
反對 回復 2022-06-12
?
肥皂起泡泡

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 }));



查看完整回答
反對 回復 2022-06-12
  • 3 回答
  • 0 關注
  • 183 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號