Эффективный способ найти и заменить значения в DataColumn
У меня есть набор данных, содержащий один DataTable, и эта таблица получила 3 столбца (Column1,Data,Column2) и несколько строк данных.
У меня также есть словарь, который содержит список значений, которые мне нужно искать в DataColumn и значения, которые я должен заменить исходные значения.
Я хочу искать в столбце с именем "Данные".
Следующее изображение содержит исходную таблицу данных и результирующую таблицу данных вместе со словарем, который содержит ключи и значения, которые необходимо найти и заменить.
Какой самый эффективный способ выполнить эту операцию?
3 ответа
Я уверен, что есть лучший способ сделать это с помощью LinQ, но это будет делать
Dictionary<string,string> dic = new Dictionary<string,string>();
dic.Add("AAA", "A++");
dic.Add("BBB", "B++");
foreach(KeyValuePair<string, string> kvp in dic)
{
DataRow[] sl = dt.Select("DATA='" + kvp.Key + "'");
foreach(DataRow r in sl)
r["DATA"] = kvp.Value;
}
Внутренний цикл foreach можно заменить выражением
sl.ToList().ForEach(x => x.SetField<string>("DATA", kvp.Value));
но я не проверял на производительность
Вероятно, это не очень эффективно для больших наборов данных, но нужно учесть цикл по ключевым словам, а не по отдельным строкам таблицы.
Я бы справился с этим так:
DataSet ds = new DataSet();
string strNewXmls = ds.GetXml().Replace("AAA", "A++");
System.IO.StringReader srXmlStringReader = new System.IO.StringReader(strNewXmls);
ds.ReadXml(srXmlStringReader, XmlReadMode.IgnoreSchema);
Это быстрое и простое решение. Вы можете сделать это с любыми вещами во всем вашем наборе данных.
Надеюсь, поможет,
Taragneti
Перейти на простоту
foreach (DataRow row in dataSet.Tables[0].AsEnumerable())
{
string data = row.Field<string>("Data");
string newData = null;
if (dict.TryGetValue(data, out newData))
{
row.SetField("Data", newData);
}
}
(вам нужно добавить System.Data.DataSetExtensions к ссылкам вашего проекта)