2013-04-25 57 views
0

我有表4列。Linq选择多个列作为单独的阵列

JobId StateId Salary  Expense 
1   1  35,000  31,000 
1   1  33,000  25,000 
1   2  28,000  26,000 
2   2   7,000  16,000 
2   2   6,000  20,000 
2   1   9,000  22,000 
2   1  15,000  29,000 

通过使用C#中LINQ,我要通过的JobId和STATEID combination.For每个组合我想薪金的阵列和费用的阵列组。

我可以通过为每个组合得到一个列作为阵列,通过使用这个

(from r in myTable.AsEnumerable() 
     group r by new { 
      jobId = r.Field<int>("JobId"), 
      stateId = r.Field<int>("StateId") 
     }).ToDictionary(
     l => Tuple.Create(l.Key.jobId, l.Key.stateId), 
     l=> (from i in l select i.Field<double>("Salary")).AsEnumerable() 
); 

如何可以有薪金和费用两个阵列的每个组??

我的目标是找到每种组合的平均薪水和平均费用,并执行一些其他操作。或者至少告诉我如何选择多个列作为单独的数组。

注意:我不想收集每个组合的匿名对象。

回答

4

要选择两个不同的列在您的查询的集合,你可以这样做:

var result = 
    (from r in myTable.AsEnumerable() 
    group r by new 
    { 
     jobId = r.Field<int>("JobId"), 
     stateId = r.Field<int>("StateId") 
    } into g 
    select new 
    { 
     g.Key, 
     Salaries = g.Select(x => x.Field<double>("Salary")), 
     Expenses = g.Select(x => x.Field<double>("Expense")) 
    }) 
    .ToDictionary(
     l => Tuple.Create(l.Key.jobId, l.Key.stateId), 
     l => new { l.Salaries, l.Expenses } 
    ); 

然后你就可以计算出平均值相当容易:

var averageSalary = result[...].Salaries.Average(); 
var averageExpense = result[...].Expenses.Average(); 

但如果你真正需要的是平均水平,这将工作:

var result = 
    (from r in myTable.AsEnumerable() 
    group r by new 
    { 
     jobId = r.Field<int>("JobId"), 
     stateId = r.Field<int>("StateId") 
    } into g 
    select new 
    { 
     g.Key, 
     AverageSalary = g.Average(x => x.Field<double>("Salary")), 
     AverageExpense = g.Average(x => x.Field<double>("Expense")) 
    }) 
    .ToDictionary(
     l => Tuple.Create(l.Key.jobId, l.Key.stateId), 
     l => new { l.AverageSalary, l.AverageExpense } 
    ); 
+0

谢谢你的回答。除了平均水平,我还需要做一些额外的工作。在后面的过程中,我想选择特定组合的费用/工资数组,并执行一些处理 – KhanSharp 2013-04-25 20:01:32

+0

@KhanSharp,在这种情况下,您可以使用我的第一个代码示例。为了完整性,我已经包含了更多信息。 – 2013-04-25 20:48:31

-1

不要对这种语句使用LINQ。如果你需要统计分组和计算某种平均工资/费用,你可以尝试列表:

List<myType> myList = new List<myType>(); 

//add stuff to myList 

List<myType> JobID1 = new List<myType(); 
List<myType> JobID2 = new List<myType(); 

foreach(var item in myList) 
{ 
    if(item.JobID == 1) 
     JobID1.add(item); 
    if(item.JobID == 2) 
     JobID2.add(item); 
} 

int avgSalOne; 

foreach(var item in JobID1) 
{ 
    avgSalOne += item.Salary; 
} 

avgSalOne = avgSaleOne/JobID2.Count; 

//Note that you get Job Id 2 average salary the same way, and also the Expense by changing item. Salary to item.Expense 
+0

如果他开始执行'JobID'和'StateID'的组合,会出现很多'IF语句'。 – 2013-04-25 19:57:20

+0

我有一个非常大的数组,我想利用延迟执行的LINQ以及并行执行 – KhanSharp 2013-04-25 20:06:20

+0

@KhanSharp你不会有这里的并行执行 – 2013-04-25 22:17:24