LINQ在评估多行时选择不同

时间:2011-07-11 16:07:56

标签: c# vb.net linq

我有一个EnumerableRowCollection,如下所示:

VendorCode | GroupType | Variance
    01165       G          .16
    01165       G          .16

    01165       CH         .16
    01165       CH         .18

    07754       G          .25
    07754       G          .25
    07754       G          .39

基本上,这是一个庞大的供应商代码列表,它们的组和价格差异。我需要编写一个查询来创建不同的列表供应商代码和组类型。然而,问题是,我需要评估与特定VendorCode / GroupType相关的所有差异,以查看它们是否完全相同 - 它们不是,我需要返回某种方式来表示该组具有“自定义“方差,否则它需要返回值(即:如果它们都是.16,则返回.16,如果有多个值,则返回”自定义“)

根据我上面列出的列表,结果看起来像这样。

VendorCode | GroupType | Variance
   01165        G          .16
   01165        CH         custom
   07754        G          custom

我可以毫不费力地获得VendorCode / GroupType的独特列表 - 这就是我目前所拥有的:

Dim distinctList = From q In query Select q.VendorCode, q.GroupType, (evaluated q.Variance here?) Distinct

(其中“query”是EnumerableRowCollection(Of(匿名类型)))

我不知道如何评估方差属性以获得我需要的结果 - 任何想法?

1 个答案:

答案 0 :(得分:2)

我无法做VB,但在C#中我觉得你想要的东西是:

var query = from item in source
            group item by new { item.VendorCode, item.GroupType } into g
            select new { g.Key.VendorCode,
                         g.Key.GroupType,
                         Variance = ComputeVariance(g) };

...

string ComputeVariance(IEnumerable<YourItemType> group)
{
    var distinctVariance = group.Select(x => x.Variance)
                                .Distinct();
    using (var iterator = distinctVariance.GetEnumerator())
    {
        iterator.MoveNext(); // Assume this will return true...
        var first = iterator.Current;
        return iterator.MoveNext() ? "custom" : first.ToString();
    }
}

假设你正在使用LINQ to Objects。如果您需要在LINQ to SQL等中执行此操作,我会采用稍微不同的方法。