0

下手な英語でごめんなさい...

データテーブルの例

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

コードは私が望むものを返します。

私の質問は、私が何を間違えたのですか?

4

3 に答える 3

1

結合が機能しない理由は、同じテーブルに結合しているため、12行(6 + 6で、すべて同じID_UEH値の「対応する」行がある)になるためです。したがって、3 の正しい結果も 2 倍になります。

編集:これが必要なものであり、以下の最初のアプローチよりも読みやすいと思います:

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

あなたのループにとどまります....それが機能する場合は、説明したこととは異なることを行うためです。

于 2013-08-28T20:27:56.000 に答える
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();
于 2013-08-28T19:38:15.310 に答える
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();
于 2013-08-29T03:24:41.030 に答える