簡體   English   中英

如何使用Linq計算在“ A”列中具有值但在“ B”列中具有不同值的行數

[英]How do I count the number of rows that have a value in column “A”, but have a different value in column “B” using Linq

抱歉英語不好...

DataTable示例

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

我想做一個函數來檢查是否有符合以下說明的行:
-'ID_UEH'列中的值不同,但'ID_F'列中的值相同

我嘗試了這個:

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

和代碼返回我想要的。

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

ID_UEH不起作用的原因是:您正在使用同一表ID_UEH因此您將獲得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)); });
 
  

保持循環……如果可行,因為它所做的與您描述的有所不同。

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

請嘗試以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM