Сравнить результаты двух разделенных строк?
У меня есть два строковых ввода, которые были разделены, поэтому каждый элемент отличается от другого (это такие параметры продукта, как длина, вес, отделка, цвет пятна и т. Д.). Одна строка имеет исходные значения для продукта, а другая - новые значения (какими бы они ни были - пользователи могут редактировать любые значения продукта, которые они хотят).
Прямо сейчас у меня есть разделенные строки, производящие нужную мне информацию, но я не уверен, как сравнить результаты друг с другом, так как отдельные значения продукта находятся внутри циклов foreach.
Вот что у меня есть:
//checks to see which attributes have been changed/edited for the product
protected bool ifAttrChanged(string oldItm, string newItm)
{
bool retVal = false;
//get the original attributes of the product
string[] oldItms = oldItm.Split(',');
foreach (string oItm in oldItms)
{
if (oItm != "")
{
string[] oldThings = oItm.Split(',');
string oldies = oldThings.GetValue(0).ToString();
}
}
//get whatever new values have been entered for the product
string[] newItms = newItm.Split(',');
foreach (string nItm in newItms)
{
if (nItm != "")
{
string[] newThings = nItm.Split(',');
string newbies = newThings.GetValue(0).ToString();
}
}
if (newItms.ToString().Equals(oldItms.ToString(), StringComparison.Ordinal))
{
retVal = false;
Label3.Text += retVal.ToString() + "<br />";
}
else
{
retVal = true;
Label3.Text += retVal.ToString() + "<br />";
}
return retVal;
}
Я действительно хотел бы сравнить строковую переменную oldies с строковой переменной newbies (странные имена, но я не беспокоюсь об этом), но каждый из них в своем собственном выражении foreach, и я не могу получить к ним доступ в другом месте. Как можно успешно сравнить старые и новые значения двух разделенных строк, чтобы я мог узнать, какие значения были изменены, а какие остались прежними?
2 ответа
При этом все строки разделяются и хранятся в массивах (oldItems и newItems) и с использованием System.Linq.
Попробуй это:
var changedResults = newItems.Where(x => !oldItems.Any(y => x == y));
При этом вы получите IEnumerable со всей строкой в newItems, которая не появляется в массиве oldItems. Если вы хотите преобразовать это в список или что-то, добавьте это:
var changedResults = newItems.Where(x => !oldItems.Any(y => x == y)).ToList();
надеюсь, это поможет
Что такое "изменение"? Добавление? Удаление? Модификация?
Если только дополнение, метод Оскара работает. Это то же самое (установить разницу), но немного более кратко:
var changedResults = newItems.Except(oldItems)
Однако, если удаление также является "изменением", вам нужно будет рассмотреть его с обеих сторон.
var changedResults = newItems.Except(oldItems).Union(oldItems.Except(newItems));
Поскольку наборы состоят только из строк, понятие модификации отсутствует.