LINQ选择多个列作为单独的数组

问题描述 投票:0回答:2

我有表4列。

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组合进行分组。对于每个组合,我都需要一个Salary数组和Expense数组。

我可以通过使用每个组合将一列作为数组使用

(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()
  );

我该如何为每个组分配两个数组的薪金和费用?

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

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

c# visual-studio-2010 performance linq linq-to-sql
2个回答
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 }
    );

-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
© www.soinside.com 2019 - 2024. All rights reserved.