DataTableに3つの列があります
ID名数
1ジェームズ4345
2クリステン89231
3ジェームス599
4 Suneel 317113
行1と3を削除し、新しいデータテーブルが行2と4のみを返す必要があります。SOの提案で非常に良い関連の質問を見つけました-この男。しかし、彼のソリューションはハッシュテーブルを使用しており、1行と3行の両方ではなく、行3のみを削除しています。
DataTableに3つの列があります
ID名数
1ジェームズ4345
2クリステン89231
3ジェームス599
4 Suneel 317113
行1と3を削除し、新しいデータテーブルが行2と4のみを返す必要があります。SOの提案で非常に良い関連の質問を見つけました-この男。しかし、彼のソリューションはハッシュテーブルを使用しており、1行と3行の両方ではなく、行3のみを削除しています。
私はこれを試しましたデータテーブルから重複を削除します..
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オブジェクト
このようなものはどうですか;
疑似コード: オブジェクトに [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 を使用します。
さて、パンディヤさんから教えてもらったブログを見てみました。コメント セクションでは、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 重などは含まれません。誰かができる場合は、このコードを更新して、そのような削除を反映してください。