2013-04-25 68 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