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);
       }
    }