2009-08-14 1 views
3

こんにちは、私はasp.netでデータテーブルを使用しています。私はデータテーブルから一意のデータをどのようにフィルタリングできるのか理解できません。ASP.NET:データテーブルから一意の行をフィルタする

問題は、私は、第1および第2のカラムに適用されたフィルタに基づいて出力を次のようになる

Data Table: 
Consumer No Date    Value 
ABC001   1st Aug 09 1 
ABC001   1st Aug 09 2 
ABC001   2nd Aug 09 1 
XYZ001   1st Aug 09 1 
XYZ002   1st Aug 09 1 
XYZ002   1st Aug 09 2 

下に記述されます。出力では、第1列と第2列の固有の組み合わせがあることがわかります。

Consumer No Date    
ABC001   1st Aug 09 
ABC001   2nd Aug 09 
XYZ001   1st Aug 09 
XYZ002   1st Aug 09 

データテーブルにフィルタを適用するにはどうすればよいですか?

+0

重複を取り除くだけでループすることはできませんか? –

+0

こんにちは、 ループする必要はありません。 phoenix/Preetsの返信をお読みください。それは私を助ける –

答えて

10
yourdataset.Tables["TableName"].DefaultView.ToTable(true,"disticecolumn"); 

既存 のDataViewの行に基づく新しいDataTableを を作成し、返します。

.ToTableメソッドでtrueを返すと、返されるDataTableには、すべての列に対して異なる値を持つ行が含まれます。

記事msdnから

編集:

あなたが '明確な' キーワードを使用することができ、データベースからこれを実行するために容易になるだろう。

0
private static DataTable SelectDistinct(DataTable SourceTable, params string[] FieldNames) 
{ 
    object[] lastValues; 
    DataTable newTable; 
    DataRow[] orderedRows; 

    if (FieldNames == null || FieldNames.Length == 0) 
      throw new ArgumentNullException("FieldNames"); 

    lastValues = new object[FieldNames.Length]; 
    newTable = new DataTable(); 

    foreach (string fieldName in FieldNames) 
      newTable.Columns.Add(fieldName, SourceTable.Columns[fieldName].DataType); 

    orderedRows = SourceTable.Select("", string.Join(", ", FieldNames)); 

    foreach (DataRow row in orderedRows) 
    { 
      if (!fieldValuesAreEqual(lastValues, row, FieldNames)) 
      { 
       newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames)); 

       setLastValues(lastValues, row, FieldNames); 
      } 
    } 

    return newTable; 
} 

private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames) 
{ 
    bool areEqual = true; 

    for (int i = 0; i < fieldNames.Length; i++) 
    { 
      if (lastValues[i] == null || !lastValues[i].Equals(currentRow[fieldNames[i]])) 
      { 
       areEqual = false; 
       break; 
      } 
    } 

    return areEqual; 
} 

private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames) 
{ 
    foreach (string field in fieldNames) 
      newRow[field] = sourceRow[field]; 

    return newRow; 
} 

private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames) 
{ 
    for (int i = 0; i < fieldNames.Length; i++) 
      lastValues[i] = sourceRow[fieldNames[i]]; 
} 

ソース:http://weblogs.asp.net/eporter/archive/2005/02/10/370548.aspx

+0

ありがとうala、 フェニックスとPreetsの返信はすばらしいです。 1行のステートメントを使用して出力を得ることができます。 –

3

あなたがセレクト()のDataTableの方法でDISTINCTフィルタを適用することができます明らかに方法はありません。

ただし、次のコード行を使用して新しいデータテーブルを作成することができます。

DataTable filterTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date"); 

この個別の行を返す必要があり、それはあなたの要件を満たします!

DevPinoy.orgのクレジット!

+1

クレジットはmsdnに送られます。 – rahul

+0

もちろん!私のGoogle検索はちょうどDevPinoyに着陸しました! – Preets

+0

こんにちはフェニックスとプリエートの両方に感謝します。また、あなたは私の目的地の道になるので、私の信用はあなたの両方に行きます。再度、感謝します –

0

あなたはこのような何かをするためにLINQを使用することができます。

var resultSet = (from r in dt.AsEnumerable() 
    select r["ConsumerNo"]).Distinct().ToList(); 

Using LINQ to manipulate DataTable's data

最高RGDS

0
DataTable filteredTable = yourDataTable.DefaultView.ToTable("TargetTable", true, "Consumer", "No", "Date"); 

このコードをポストを参照してくださいおかげで....私の要件を満たし!たくさん!

関連する問題