C# 添加或修改列表值
我有一个名为C# 添加或修改列表值,c#,list,foreach,C#,List,Foreach,我有一个名为ValueModelClass的模型类,我将它的所有值存储到列表中。理想情况下,如果列表中的ValueModelClass数据中有3个传入值匹配,我将在列表中修改它的值以避免任何重复 使用以下代码执行操作。但是在这种情况下,当列表中的ValueModelClass值被修改时,当它从foreach循环中出来时,数据会再次添加到列表中。如果在foreach循环下修改了值,我不想添加到列表中。请建议我怎么做 List<ValueModelClass> listValues =
ValueModelClass
的模型类,我将它的所有值存储到列表中。理想情况下,如果列表中的ValueModelClass
数据中有3个传入值匹配,我将在列表中修改它的值以避免任何重复
使用以下代码执行操作。但是在这种情况下,当列表中的ValueModelClass
值被修改时,当它从foreach
循环中出来时,数据会再次添加到列表中。如果在foreach
循环下修改了值,我不想添加到列表中。请建议我怎么做
List<ValueModelClass> listValues = new List<ValueModelClass>();
string[] data = line.Split(',');
foreach (var listValue in listValues.ToArray())
{
if (listValue.name == data[4] && listValue.description == data[3] && listValue.rule == data[2])
{
var i = listValues.FindIndex(x => x.hostName.Equals(listValue.name));
listValues[i].destinationValue.Add(data[0]);
listValues[i].sourceKey.Add(data[1]);
}
}
listValues.Add(ValueModelClass);
但我得到的结果是
{"destinationValue":["https://test.com","https://test2.com","https://test3.com","https://test3.com"],"sourceKey":["/test","/test2","/test3","/test3"],"rule":"rulename1","name":"name1","description":" description1"}
{"destinationValue":["https://test1.com"],"sourceKey":["/test1"],"rule":"rulename2","name":"name2","description":" description2"}
{"destinationValue":["https://test2.com"],"sourceKey":["/test2"],"rule":"rulename1","name":"name1","description":" description1"}
{"destinationValue":["https://test3.com"],"sourceKey":["/test3"],"rule":"rulename1","name":"name1","description":" description1"}
正如Rufus L在评论中建议的,你需要重新审视一下你的逻辑。目前,您正在查看整个listValues
集合,并验证是否所有项目都符合您的重复标准。如果任何值不同-您正在添加一个新条目
但是您需要做相反的事情——如果任何值匹配——不要添加新值!以下是潜在的解决方案:
foreach (var line in dataline)
{
string[] data = line.Split(',');
ValueModelClass valueModelClass = new ValueModelClass()
{
destinationValue = new List<string> { data[0] },
sourceKey = new List<string> { data[1] },
rule = data[2],
description = data[3],
name = data[4]
};
if (listValues.Any(x => x.name == data[4] && x.description == data[3] && x.rule == data[2]))
{
var i = listValues.FindIndex(x => x.name.Equals(valueModelClass.name));
listValues[i].destinationValue.Add(data[0]);
listValues[i].sourceKey.Add(data[1]);
}
else
{
listValues.Add(valueModelClass);
}
}
foreach(数据行中的变量行)
{
string[]data=line.Split(',');
ValueModelClass ValueModelClass=新的ValueModelClass()
{
destinationValue=新列表{data[0]},
sourceKey=新列表{data[1]},
规则=数据[2],
description=数据[3],
名称=数据[4]
};
if(listValues.Any(x=>x.name==data[4]&&x.description==data[3]&&x.rule==data[2]))
{
var i=listValues.FindIndex(x=>x.name.Equals(valueModelClass.name));
listValues[i].destinationValue.Add(数据[0]);
listValues[i].sourceKey.Add(数据[1]);
}
其他的
{
添加(valueModelClass);
}
}
请提供一个包含ValueModelClass
源代码的列表。您不需要来排列,因为您实际上并没有在循环中改变列表。我很难理解您实际上在做什么want@mjwills:请参考@Dhillli4u处的示例您当前的代码不会修改列表中的列表foreach
循环。它修改列表中的项目。修改列表将删除或添加项目。如果Add
在循环中,那么是的,您需要ToArray
。非常感谢您的建议。我在foreach循环中使用LINQ,这导致了问题。尝试你的建议对我有用。
foreach (var line in dataline)
{
string[] data = line.Split(',');
ValueModelClass valueModelClass = new ValueModelClass()
{
destinationValue = new List<string> { data[0] },
sourceKey = new List<string> { data[1] },
rule = data[2],
description = data[3],
name = data[4]
};
if (listValues.Any(x => x.name == data[4] && x.description == data[3] && x.rule == data[2]))
{
var i = listValues.FindIndex(x => x.name.Equals(valueModelClass.name));
listValues[i].destinationValue.Add(data[0]);
listValues[i].sourceKey.Add(data[1]);
}
else
{
listValues.Add(valueModelClass);
}
}