为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不知道 C# 中的底层类型的情况下遍历数组

如何在不知道 C# 中的底层类型的情况下遍历数组

C#
慕田峪9158850 2021-06-29 13:57:53
假设我有一组对象,其中一些是数组。我想连接所有值来打印它们,但我不知道数组中元素的类型。foreach(var item in myList){    var val = item.Property;    if (val.GetType().IsArray)    {        var array = val as IEnumerable<object>;        val = string.Join(",", array);    }    DoSomething(val);}如果 val 包含 a string[],则此代码片段将起作用,也适用于 a myClass[]。但是如果它包含一个int[]or double[],则数组将为空,这意味着动态转换失败。如果 int 或 double 是从 System.TypeValue 继承的,而 System.TypeValue 是从 object 继承的,为什么此代码片段不起作用?我怎么能做到这一点?编辑:将代码片段更改为更明确,并避免出现错误的变量使用,因为我错误地简化了我的代码。
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

在 C# 中是不允许这样做的,更多细节在这里。但是您可以转换为non-generic IEnumerable,然后在推送到之前将所有内容转换为 object string.Join()


foreach(var val in myList)

{

    if (val.GetType().IsArray)

    {

        var array = (IEnumerable)val;

        // It's not allowed to set val variable, but I assume it's just an example

        val = string.Join(",", array.Cast<object>());

    }

}


查看完整回答
反对 回复 2021-07-03
?
温温酱

TA贡献1752条经验 获得超4个赞

首先,尝试分配到循环val内部是foreach行不通的。您无法更改正在迭代的集合。


所以你需要建立一个新的集合。像这样的工作,看看yield return迭代器中的语句如何让您构建一个新IEnumerable的叶对象,并适用于任何级别的对象和值类型。


    class Program

    {

        static void Main(string[] args)

        {

            var myWackyList = new object[] {

                new[]{1d, 2d},

                3d,

                new[]{4d, 5d},

                new []

                {

                    new[]

                    {

                        6d

                    }

                },

                "7",

                new[]{ "8", "9"}

            };


            Console.WriteLine( string.Join(", ", Flatten( myWackyList )));

        }


        static IEnumerable<object> Flatten(IEnumerable enumerable)

        {

            foreach (var val in enumerable)

            {

                if ( val.GetType().IsArray )

                    foreach ( var flattenedVal in Flatten( val as IEnumerable ) )

                        yield return flattenedVal;

                else

                    yield return val;

            }

        }

    }


查看完整回答
反对 回复 2021-07-03
  • 3 回答
  • 0 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信