0

DataTableに3つの列があります

ID名数

1ジェームズ4345

2クリステン89231

3ジェームス599

4 Suneel 317113

行1と3を削除し、新しいデータテーブルが行2と4のみを返す必要があります。SOの提案で非常に良い関連の質問を見つけました-この男。しかし、彼のソリューションはハッシュテーブルを使用しており、1行と3行の両方ではなく、行3のみを削除しています。

4

3 に答える 3

0

私はこれを試しましたデータテーブルから重複を削除します..

using System.Data;
using System.Linq;
...
//assuming 'ds' is your DataSet
//and that ds has only one DataTable, therefore that table's index is '0'
DataTable dt = ds.Tables[0];
DataView dv = new DataView(dt);
string cols = string.Empty;
foreach (DataColumn col in dt.Columns)
{
if (!string.IsNullOrEmpty(cols)) cols += ",";
cols += col.ColumnName;
}
dt = dv.ToTable(true, cols.Split(','));
ds.Tables.RemoveAt(0);
ds.Tables.Add(dt);

次の1行のコードは、重複する行を回避します。

ds.Tables["Employee"].DefaultView.ToTable(true,"Name");

ds –データセットオブジェクト

dt.DefaultView.ToTable( true, "Name");

dt –DataTableオブジェクト

于 2010-07-08T05:01:13.177 に答える
0

このようなものはどうですか;

疑似コード: オブジェクトに [Id、Name、Value] の 3 つのプロパティがあり、NameObjects と呼ばれ、IEnumerable (List NameObjects;) であると仮定します。

var _newNameObjectList = new List<NameObject>();

foreach(var nameObject in NameObjecs)
{
   if(_newNameObjectList.Select(x => x.Name == nameObject.Name).ToList().Count > 0)
   {
      _newNameObjectList.RemoveAll(x => x.Name == nameObject.Name);
      continue;
   }
   else
   {
      _newNameObjectList.Add(nameObject); 
   }
}

これはうまくいくはずです。これは名前空間 System.Linq を使用します。

于 2010-07-08T05:18:31.403 に答える
0

さて、パンディヤさんから教えてもらったブログを見てみました。コメント セクションでは、Kevin Morris という名前のチャップが C# Dictionary を使用したソリューションを投稿しました。

私のメインブロックでは、次のように書きました。

string keyColumn = "Website";
RemoveDuplicates(table1, keyColumn);

そして、私の RemoveDuplicates 関数は次のように定義されました。

    private void RemoveDuplicates(DataTable table1, string keyColumn)
{
    Dictionary<string, string> uniquenessDict = new Dictionary<string, string>(table1.Rows.Count);
    StringBuilder sb = null;
    int rowIndex = 0;
    DataRow row;
    DataRowCollection rows = table1.Rows;
    while (rowIndex < rows.Count - 1)
    {
        row = rows[rowIndex];
        sb = new StringBuilder();
            sb.Append(((string)row[keyColumn]));


        if (uniquenessDict.ContainsKey(sb.ToString()))
        {
            rows.Remove(row);
            if (RemoveAllDupes)
            {
                row = rows[rowIndex - 1];
                rows.Remove(row);
            }
        }
        else
        {
            uniquenessDict.Add(sb.ToString(), string.Empty);
            rowIndex++;
        }
    }
}

ブログにアクセスすると、複数の列で重複をスニッフィングできる、より一般的な関数が見つかります。すべての重複行を削除する場合に備えて、RemoveAllDupes フラグを追加しましたが、これは行が名前順に並べられていることを前提としており、重複のみが含まれ、3 重、4 重などは含まれません。誰かができる場合は、このコードを更新して、そのような削除を反映してください。

于 2010-07-08T17:53:11.180 に答える