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

C# LINQ选择多个列作为单独的数组,c#,visual-studio-2010,performance,linq,linq-to-sql,C#,Visual Studio 2010,Performance,Linq,Linq To Sql,我有表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

我有表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组合进行分组。对于每个组合,我需要一个薪水数组和费用数组

我可以得到一列作为一个数组,通过使用

(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()
  );
我怎样才能在两个数组中为每个组设置薪资和费用

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


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

不要将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

不要将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

要在查询中选择两个不同的列作为集合,可以执行以下操作:

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

要在查询中选择两个不同的列作为集合,可以执行以下操作:

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

如果他开始将JobID与StateID进行组合,将会有很多IF语句。我有一个非常大的数组,我想利用LINQ的延迟执行以及并行execution@KhanSharp这里不会有并行执行,如果他开始组合执行我有一个非常大的数组,我想利用LINQ的延迟执行和并行execution@KhanSharp你不会在这里并行执行谢谢你的回答。除了平均水平外,我还需要做一些额外的工作。在后面的过程中,我想为一个特定的组合选择费用/薪水数组,并做一些调整processing@KhanSharp在这种情况下,您可以使用我的第一个代码示例。为了完整起见,我提供了更多的信息。谢谢你的回答。除了平均水平外,我还需要做一些额外的工作。在后面的过程中,我想为一个特定的组合选择费用/薪水数组,并做一些调整processing@KhanSharp在这种情况下,您可以使用我的第一个代码示例。为了完整起见,我已经包含了更多的信息。