我有两个字符串输入,它们已被拆分,因此每个项目都可以与另一个项目区分(这些项目是产品属性,如长度,重量,光洁度,污点颜色等)。一个字符串具有产品的原始值,而另一个字符串具有新值(无论它们是什么 - 用户可以编辑他们想要的任何产品值)。
现在,我有分裂字符串产生我想要的信息,但我不确定如何将结果相互比较,因为各个产品值都在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语句中,我无法在其他地方访问它们。如何成功比较两个分割字符串的旧值和新值,以便我可以获得哪些值已更改以及哪些值保持不变?
答案 0 :(得分:3)
将所有字符串拆分并存储在数组(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();
我希望这会有所帮助
答案 1 :(得分:1)
什么是&#34;变更&#34;?加成?删除?修改
如果只是加法,奥斯卡的方法有效。这是相同的(设置差异),但更简洁:
var changedResults = newItems.Except(oldItems)
但是,如果删除是&#34;更改&#34;同样,你需要从双方都考虑它。
var changedResults = newItems.Except(oldItems).Union(oldItems.Except(newItems));
由于集合只是字符串,因此没有修改的概念。