我在这个数据表中有数据。
id antena size width kpi1value kpi2value kpi3value erlvalue mbvalue kpi4value
ab1 22 33 40 20 22
ab2 33 45 50 30 30
ab3 11 40 60 20 33
ab1 22 33 40 55 25
ab2 33 45 50 30 22
ab3 11 40 60 20 90
ab1 22 33 40 40
ab2 33 45 50 50
ab3 11 40 60 20
ab1 22 33 40 45
ab2 33 45 50 55
ab3 11 40 60 20
现在,我必须使用通用ID来安排这些数据。喜欢这个
id antena size width kpi1value kpi2value kpi3value erlvalue mbvalue kpi4value
ab1 22 33 40 20 55 40 22 25 45
ab2 33 45 50 30 30 50 30 22 55
ab3 11 40 60 20 20 20 33 90 20
我尝试使用DefaultView删除重复项。
dt = dt.DefaultView.ToTable(true)
但是,有了这个,我得到了所有专栏。
那么,我如何在数据表中安排这些数据?
答案 0 :(得分:2)
我认为没有特殊的方法可以获得预期效果,但很难预测用户想要使用非唯一数据(等等,kpi1value,kpi2value)。我认为你很幸运,程序员喜欢重新发明轮子的过程,所以我编写了一些可能用于完成任务的代码。
public DataTable SpecialDistinct(DataTable table,
IList<string> uniqueFields, IList<string> otherFields)
{
// create a table for results
var resultTable = table.Clone();
var view = new DataView(table);
var distinctTable = view.ToTable(true, uniqueFields.ToArray());
foreach (DataRow distictRow in distinctTable.Rows)
{
var row = resultTable.NewRow();
foreach (var uniqueField in uniqueFields)
{
row[uniqueField] = distictRow[uniqueField];
}
IEnumerable<DataRow> selectedRows = table.AsEnumerable().Where(
r => uniqueFields.All(
uniqueField => r[uniqueField].Equals(distictRow[uniqueField])));
foreach (var otherField in otherFields)
{
var selectedRow = selectedRows.FirstOrDefault(
r => r[otherField] != DBNull.Value);
if (selectedRow != null)
row[otherField] = selectedRow[otherField];
}
resultTable.Rows.Add(row);
}
return resultTable;
}
[TestMethod]
public void SpecialDistinctTest()
{
// create a table
var table = new DataTable();
var uniqueFields = new List<string> { "ID", "antenna", "size" };
var otherFields = new List<string> { "kpi1value", "kpi2value" };
foreach (var uniqueField in uniqueFields)
{
table.Columns.Add(new DataColumn(uniqueField, typeof(Int32)));
}
foreach (var otherField in otherFields)
{
table.Columns.Add(new DataColumn(otherField, typeof(Int32)));
}
// add some items.
AddRows(table);
DataTable resultTable = SpecialDistinct(table, uniqueFields, otherFields);
// check results from the table table
}
private void AddRows(DataTable table)
{
DataRow row = table.NewRow();
row.ItemArray = new object[] { 22, 33, 40, 20, DBNull.Value };
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 33, 45, 50, 30, DBNull.Value };
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 22, 33, 40, DBNull.Value, 55 };
table.Rows.Add(row);
row = table.NewRow();
row.ItemArray = new object[] { 33, 45, 50, DBNull.Value, 30 };
table.Rows.Add(row);
}
原始表格
结果表