2013-08-28 17 views
0

Sry基因的英文不好...如何計算已在「A」列的值的行數,但在「B」列不同的值使用LINQ

DataTable的例子

| ID_UEH  | ID_F | 
|......1......|...10...| 
|......1......|...11...| 
|......2......|...10...| 
|......2......|...12...| 
|......3......|...10...| 
|......3......|...13...| 

我想使來檢查,如果有,接着規範的行的函數:
- 在列「ID_UEH」不同的值,但在相同的列中的值「ID_F」

我tryed此:

(from rowA in DataTableA.Select() 
join rowB in DataTableA.Select() 
    on rowA["ID_F"] equals rowB["ID_F"] 
where rowA["ID_UEH"] != rowB["ID_UEH"]).Count() 

,代碼返回0

然後我試試這個:

(from rowA in DataTableA.Select() 
join rowB in DataTableA.Select() 
    on rowA["ID_F"] equals rowB["ID_F"] 
where rowA["ID_UEH"] != rowB["ID_UEH"] && 
     rowA["ID_F"] == rowB["ID_F"]).Count() 

和代碼返回6(DataTableA.Rows.Count = 6)

然後他們問我快點,我這樣做:

int numRows = 0; 
foreach (DataRow rowA in DataTableA.Select()) 
{ 
    numRows = tabela.Select( 
    "ID_UEH <> "+Convert.ToInt32(rowA["ID_UEH"]) + " AND " + 
    "ID_F= " + Convert.ToInt32(rowA["ID_F"]) 
             ).Length; 
    if (numRows > 1) 
     break; 
} 

和代碼返回什麼我想。

我的問題是,我做錯了什麼?

+0

什麼是你定的例子正確的答案?你能寫一個邏輯語句來確定結果嗎? –

+0

@KirkBroadhurst:正確的答案是3,因爲只有三行等於ID_F,所有值都是10,所有ID_UEH值都不同(1,2,3)。 –

回答

1

爲什麼加入不起作用的原因是:你用相同的表連接,所以你得到12行(6 + 6,所有有「對口」具有相同ID_UEH值)。所以3的正確結果也翻倍了。

編輯:我想這是你需要什麼,比我下面第一種方法更具有可讀性:

var rows = dataTableA.AsEnumerable(); 
int count = rows.Count(r1 => rows 
       .Any(r2 => r1.Field<int>("ID_F") == r2.Field<int>("ID_F") 
         && r1.Field<int>("ID_UEH") != r2.Field<int>("ID_UEH"))); 

這裏是LINQ它給你正確的結果。然而,這是不是很易讀:

int count = dataTableA.AsEnumerable() 
.GroupBy(r => r.Field<int>("ID_F")) 
.Sum(g => 
{ 
    if (g.Count() == 1) 
     return 0; 
    var allIDUEH = g.Select(r => r.Field<int>("ID_UEH")); 
    return allIDUEH.Count(ueh1 => allIDUEH.Any(ueh2 => ueh1 != ueh2)); 
}); 

陪着你的循環....如果它的作品,因爲它的東西比你所描述的不同。

+0

第一個和第三個工作,但這更容易理解 – Devacann

0
var c = DataTableA.AsEnumerable() 
        .GroupBy(r=>r.Field<int>("ID_F")) 
        .Where(g=>g.Count()>1 && 
          g.GroupBy(r=>r.Field<int>("ID_UEH")) 
          .Where(a=>a.Count()>1).Count() > 1) 
        .Count(); 
+0

這只是得到團體的人數。我想他會希望所有符合條件的組中的行數總和。儘管這很接近。 – Servy

+0

@Servy你說得對,我不知道他現在想要什麼。 –

0

嘗試以下操作:

var q = (from r in DataTableA.AsEnumerable() 
     group r by r.Field<int>("ID_F") into gr 
     let count = gr.Select(g => g.Field<int>("ID_UEH")).Distinct().Count() 
     select count > 1 ? count : 0).Sum(); 
相關問題