我有以下属性:
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;)'的类型参数 无法从使用中推断出来。尝试指定类型参数 明确。
答案 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答案的扩展,解释了为什么选择合适类型的问题
从我在旁边的第二个错误:
经过一些谷歌搜索后,我找到了this answer to the question: "SelectMany() Cannot Infer Type Argument — Why Not?"方法&#39; Enumerable.SelectMany的类型参数(IEnumerable, FUNC&GT;)&#39;无法从使用中推断出来。尝试指定类型 明确的论点。
这表明由于以下原因而发生此错误:
传递给SelectMany的委托返回的类型必须是 IEnumerable的
所以错误归结为我如何施展它:
我必须将其投放到IEnumerable<T>
,显然IList
不是这样。如果我执行以下操作,但现在可以使用:
this.ItemsSource.Cast<IEnumerable<object>>().ToList().SelectMany(x => x);