如何展平List <ilist>()?

时间:2016-02-17 14:21:34

标签: c# linq list portable-class-library

我有以下属性:

public List<List<MyClass>> Items { get; set;}

这绑定到ListViews ItemSource IEnumerable

我现在正试图压缩这个 IEnumberable ItemSource 属性。

我已设法将其投射到以下

this.ItemsSource.Cast<IList>().ToList();

因为以下演员投掷了无效的投射例外:

this.ItemsSource.Cast<List<object>>().ToList();

我现在希望将此列表展平为一个直接的对象列表。我查看this answer: Flatten List in LINQ并做了:

this.ItemsSource.Cast<IList>().ToList().SelectMany(x => x);

但这会产生以下错误:

  

'List'不包含'SelectMany'的定义,不包含   扩展方法'SelectMany'接受类型的第一个参数   可以找到“列表”(你是否错过了使用指令或者   装配参考?)

那么我做错了什么?是否可以展平List<IList>()

额外信息:

值得一提的是,我正在使用Xamarin,此代码是我PCL (portable class library)的一部分,但我确信这不是原因。

在调查这里发生的事情的同时,我也尝试过:

List<string> s = new List<string>();
s.SelectMany(x => x);

我收到错误:

  

方法'Enumerable.SelectMany(IEnumerable,Func&gt;)'的类型参数   无法从使用中推断出来。尝试指定类型参数   明确。

4 个答案:

答案 0 :(得分:3)

首先将其转换为正确的类型,然后您可以使用SelectMany

var source = (List<List<MyClass>>) this.ItemsSource;
IEnumerable<MyClass> items = source.SelectMany(list => list);

答案 1 :(得分:2)

试试这个:

this.ItemsSource.Cast<IEnumerable>().SelectMany(sublist => sublist.Cast<object>()).ToList()

我用这个示例程序对此进行了测试,并编译并运行:

class Test
{
    public List<List<int>> Items { get; set; }

    public IEnumerable ItemsSource { get { return this.Items; } }

    public List<object> Flatten
    {
        get { return this.ItemsSource.Cast<IEnumerable>().SelectMany(sublist => sublist.Cast<object>()).ToList(); }
    }
}

static class Program
{
    static void Main()
    {
        var t = new Test();
        t.Items = new List<List<int>>
        {
            new List<int> { 1, 2 },
            new List<int> { 11, 12 }
        };

        var r = t.Flatten;
    }
}

我认为,即使你知道项目的类型,你假装不知道何时使用扁平列表...这就是为什么它返回一个对象列表而不是一个整数列表。

答案 2 :(得分:0)

只是做 -

var flattened = Items.SelectMany(a => a);

答案 3 :(得分:0)

好的,有趣的是这里。这是@TimSchmelters答案的扩展,解释了为什么选择合适类型的问题

从我在旁边的第二个错误:

  

方法&#39; Enumerable.SelectMany的类型参数(IEnumerable,   FUNC&GT;)&#39;无法从使用中推断出来。尝试指定类型   明确的论点。

经过一些谷歌搜索后,我找到了this answer to the question: "SelectMany() Cannot Infer Type Argument — Why Not?"

这表明由于以下原因而发生此错误:

  

传递给SelectMany的委托返回的类型必须是   IEnumerable的

所以错误归结为我如何施展它:

我必须将其投放到IEnumerable<T>,显然IList不是这样。如果我执行以下操作,但现在可以使用:

this.ItemsSource.Cast<IEnumerable<object>>().ToList().SelectMany(x => x);