2011-07-11 85 views
1

我有一个类似如下的EnumerableRowCollection:LINQ SELECT DISTINCT在评价多行

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,如果有多个值,则返回”custom“)

结果看起来像这样,基于关闭我上面列出的名单。

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 

(其中 “查询” 是一个EnumerableRowCollection(中(匿名类型)) )

虽然我对如何评估方差属性以获得我需要的结果感到茫然 - 任何想法?

回答

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到对象。如果你需要在LINQ to SQL等中这样做,我会采取一种稍微不同的方法。