执行时间错误:SelectMany



我正在尝试识别对象中的可枚举属性,然后将其转换为字典对象

我用lambda表达式编写了一个linq查询,将列表的列表转换为列表,我下面的例子来自这篇msdn文章

当我尝试在LINQPad中执行以下程序时,我得到一个编译时错误

void Main()
{
       var list = new List<int>();
       list.Add(1);
       list.Add(2);
       var list2 = new List<string>();
       list2.Add("ab");
       list2.Add("xy");
       var obj = new { x = "hi", y = list, z = list2 , a =1};

       var properties = (obj.GetType()).GetProperties()
                                                     .Select(x => new {name =x.Name , value= x.GetValue(obj, null)})
                                                     .Where( x=> x.value != null && (x.value is IEnumerable) && x.value.GetType() != typeof(string) )
                                                     .Select(x => new {name = x.name, value= x.value});

       Console.WriteLine(properties);
       foreach( var item in properties)
       {
            var col = (IEnumerable) item.value;
            foreach ( var a in col)
            {
                Console.WriteLine("{0}-{1}",item.name,a);
            }
       }


       //compile time error in following line
       var abc = properties.SelectMany(prop => (IEnumerable )prop.value, (prop,propvalue) => new {prop,propvalue} )
                 .Select( propNameValue =>
                  new {
                    name = propNameValue.prop.name,
                    value = propNameValue.propvalue
                  }
                 );
        Console.WriteLine(abc);

}

方法的类型参数"System.Linq.Enumerable.SelectMany (System.Collections.Generic.IEnumerable,系统。Func>,System.Func)'不能从使用。尝试显式指定类型参数。

我如何重组SelectMany语句来摆脱错误,这样我就可以得到类似于嵌套foreach循环的输出?

我想简化你的问题,假设你有两个列表:listIntlistString

var listInt = new List<int> { 1, 2 };
var listString = new List<string> { "ab", "xy" };

然后创建listObject,如下所示:

var listObject = new object[] { listInt, listString };

如果你做SelectMany:

var output = listObject.SelectMany(list => list);

您将得到与您的相同的错误,因为两个列表包含不同的类型。您可能会想转换为IEnumerable<object>,如:

var output = listObject.SelectMany(list => (IEnumerable<object>)list);

但是它不会为listInt工作,因为协变不支持值类型。我认为唯一的解决办法是:

var output = listObject.SelectMany(list => ((IEnumerable)list).Cast<object>());

因此,为了映射您的问题,您可以更改:

prop => ((IEnumerable)prop.value).Cast<object>();

相关内容

  • 没有找到相关文章

最新更新