2

この質問に基づいて:

[LINQ で SELECT UNIQUE を実行するにはどうすればよいですか?

複数の列を含むデータタブOrganizationIDから一意の列を持つ行を選択するために、以下の式を書きました。dt

var distinctRows = (from DataRow dRow in dt.Rows
                    select new { col1 = dRow["OrganizationID_int"] }).Distinct();

しかし、式が実行された後に確認すると、列全体を保持するのではなく、distinctRows1 列 ( ) のレコードしかありません。col1and などの式を追加するcol2=...と、これらすべての列で個別に選択したいと解釈される可能性があります。

では、列全体ではなく1列のみに一意のフィルターを適用しながら、行全体を取得するにはどうすればよいですか?

4

5 に答える 5

5

すべての列でその一意の条件を満たす行全体が必要です。次のステップで繰り返したいと思います。

そのため、そのフィールドでグループ化して、複数の行の 1 つを返す必要はありません。一意の行のみが必要です。

1 つの方法はEnumerable.GroupBy、各グループの行を使用してカウントすることです。

var uniqueRows = dt.AsEnumerable()
                   .GroupBy(r => r.Field<int>("OrganizationID_int"))
                   .Where(g => g.Count() == 1)
                   .Select(g => g.First());
于 2012-11-27T13:52:47.430 に答える
1

Distinct例外メソッドには 2 つのバージョンがあり、そのうちの 1 つは、異なる要素をどのように区別するかを決定できるIEqualityCompararを取ります。

このメソッドの使用方法の完全な例を次に示します。

class Item
{
    public int Id {get; set;}
    public string Name {get;set;}
}

class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Item x)
    {
        return x.Id;
    }
}

void Main()
{
  var sequence = new List<Item>() 
  {
      new Item {Id = 1, Name = "1"}, 
      new Item {Id = 1, Name = "2"}
  };

  // Using overloaded version of Distinct method!
  var distinctSequence = sequence.Distinct(new ItemComparer());

  // distinctSequence contains inly one Item with Id = 1
  distinctSequence.Dump();
}
于 2012-11-27T13:21:50.830 に答える
1

探しているのはで、その後に、 などGroupByの集約関数が続き、各列の行の値の 1 つを選択します。MinSum

var distinctRows = 
    (from DataRow dRow in dt.Rows
    group dRow by dRow["OrganizationID_int"] into g
    select new { OrgId = g.Key; Col2 = g.First().Col2, Col3 = g.First().Col3 })
于 2012-11-27T13:22:59.550 に答える
1

Linq to DataSet でグループ化を使用します。

var distinctRows = from row in dt.AsEnumerable()
                   group row by new { 
                      col1 = row.Field<int>("OrganizationID_int")
                      // other columns here 
                   } into g
                   select g.First();
于 2012-11-27T13:25:16.580 に答える
1

MoreLinqDistinctBymethodを見てください。これを使用すると、クエリを次のように表現できます。

dt.Rows.DistinctBy(dRow => dRow["OrganizationID_int"])
于 2012-11-27T13:25:38.453 に答える