交叉型LINQ

bra*_*ing 3 .net linq

我有以下代码

    [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethod]
    public void TestEnumOfMaybe()
    {
        List<Maybe<int>> l = new List<Maybe<int>>();
        l.Add(1.ToMaybe());
        l.Add(Maybe.None<int>());
        l.Add(3.ToMaybe());

        var y = from x in l
                from y in x
                select y;

    }
Run Code Online (Sandbox Code Playgroud)

我的Maybe类型接受所有Select和SelectMany方法使Linq兼容,我有测试来证明这一点.但是,我似乎无法找到一种方法来进行交叉类型LINQ组合,如上面的测试用例.我得到的错误是

expression of type 'FunctionalExtensions.Maybe<int>' is not allowed in
a subsequent from clause in a query expression with source type
'System.Collections.Generic.List<FunctionalExtensions.Maybe<int>>'.  

Type inference failed in the call to 'SelectMany'.
FunctionalExtensions*
Run Code Online (Sandbox Code Playgroud)

有没有办法结合两种LINQ类型或我运气不好?完整的Maybe.cs实现是在

https://gist.github.com/4016243

Jon*_*eet 6

这个翻译:

// Changed variable from y to query for clarity
var query = from x in l
            from y in x
            select y;
Run Code Online (Sandbox Code Playgroud)

很简单:

var query = l.SelectMany(x => x, (x, y) => y);
Run Code Online (Sandbox Code Playgroud)

请注意,此处没有调用任何内容y.

现在l是一个List<Maybe<int>>,所以你需要尝试找到一个SelectMany在这里有效的合适方法.除非你已经添加了它,否则它会查找Enumerable.SelectMany,并且每次重载都需要第一个委托来返回IEnumerable<T>一些T.

所以这就是为什么它不起作用.你可以通过制作Maybe<T>工具IEnumerable<T>(大概产生一个结果或没有结果)使它工作.很难确定这是否是你的目标,但你基本上必须让这种扩展发挥作用.

或者,您可以为SelectMany目标编写新的重载IEnumerable<T>,对于结果是a Maybe<T>而不是a的情况IEnumerable<T>.IMO,这将是非常不直观的.