向Linq抛出异常

时间:2012-02-24 07:36:41

标签: c# linq exception

我正在加入2个内存集合

var items = 
    from el in elements 
    join def in Cached.Elements() 
        on el.Value equals def.Name into temp1
    from res in temp1.DefaultIfEmpty()                        
    select new
    {
        el.NodeType, 
        res.DefKey, 
        res.DefType, 
        res.BaseKey, 
        el.Value 
    };

然而,理想情况下,如果找不到其中一个元素,我想提出异常,类似于

throw new System.Exception(el.Value + " cannot be found in cache!");

我正在查看提供Catch扩展方法的System.Interactive,但我不确定如何在该上下文中引用当前的'el'。所以例如我想知道像

这样的东西
    var items = (
        from el in elements 
        join def in Cached.Elements() 
            on el.Value equals def.Name into temp1
        from res in temp1.DefaultIfEmpty()                        
        select new 
        { 
            el.NodeType, 
            res.DefKey, 
            res.DefType, 
            res.BaseKey, 
            el.Value 
        })
        .ThrowIfEmpty();

但是,istm,这需要将整个集合传递给扩展方法,而不是在遇到缺失值时引发异常。

或者,我可以用ThrowIfEmpty

替换DefaultIfEmpty
    var items = (
        from el in elements 
        join def in Cached.Elements() 
            on el.Value equals def.Name into temp1
        from res in temp1.ThrowIfEmpty()                        
        select new 
        { 
            el.NodeType, 
            res.DefKey, 
            res.DefType, 
            res.BaseKey, 
            el.Value 
        });

有没有'正确'/更好的方法呢?

2 个答案:

答案 0 :(得分:2)

您可以使用GroupJoin。这样的事情对你有用:

elements.GroupJoin(Cached.Elements(), e => e.Value, d => d.Name, (e, dSeq) => {
    var d = dSeq.Single();
    return new { e, d };
});

GroupJoin resultSelector接受两个参数:左键和匹配右键的序列。如果序列为空,则可以引发异常;一种方法是使用Single运算符。

答案 1 :(得分:1)

我认为这是您可以使用Composite Keys的地方之一。

如果使用equals关键字在连接时执行相等。

来自文档:

  

您可以将复合键创建为匿名类型或命名为   要比较的值。如果查询变量将是   传递方法边界,使用覆盖的命名类型   密钥的等于和GetHashCode