我有List<ParametersDetails>
。参数和ParametersDetails类类似于 -
public class ParameterDetails
{
public string Name { get; set; }
public List<Parameter> Parameters{get;set;}
}
public class Parameter
{
public string Name { get; set; }
public string Type { get; set; }
public string Value { get; set; }
public string AccountName { get; set; }
}
我希望ParameterDetails列表不应包含任何具有重复名称的参数。如果找到任何重复的参数名称,我想用字典中的Parametername + parameterDetails名称替换名称。 我可以通过遍历项目然后修改项目来完成它,但我想用较少的代码来完成它。 问题是如何遍历和查找列表中的重复项..? Linq可以吗?
我现在正在做什么 - 我已经将1个列表中的所有参数都找到了重复项
var hasDupes = dflist.GroupBy(x => new { x.Name })
.Where(x => x.Skip(1).Any()).ToArray();
接下来,我从列表中选择项目
parameterdetails.Select(x => x.Parameters.Where(p => p.Name == dupeList.Key.ToString())).ToList();
现在我不想循环参数ParameterDetials List来修改项目。 有更简单的方法吗?
EX- 我在ParameterDetails中有两个项目,如 -
ParameterDetails:
[
{
name: "test1",
Parameters:[
{
"Name":"param1",
"Type":"paramtype1",
"Value":"value1",
"AccountName":"accname1"
},
{
"Name":"param2",
"Type":"paramtype2",
"Value":"value2",
"AccountName":"accname2"
}]
},
{
name: "test2",
Parameters:[
{
"Name":"param1",
"Type":"paramtype11",
"Value":"value11",
"AccountName":"accname11"
},
{
"Name":"param2",
"Type":"paramtype22",
"Value":"value22",
"AccountName":"accname22"
}]
}]
如果我将param1作为重复名称,那么我想将其替换为&#34; param1 + test2&#34;所以它将是独一无二的。
答案 0 :(得分:0)
哟发现他们在您可以使用LINQ
的列表中复制了项目,这是使用它的代码:
var duplicates = dflist.GroupBy(s => s) .SelectMany(grp => grp.Skip(1));
该代码将返回dflist
中的所有重复项。如果要选择具有唯一属性值的所有对象,可以使用以下代码行:
var withoutNameDuplicates = dflist.GroupBy(s => s.Name).Select(grp => group.First());
然后,您可以使用以下代码将对象Name
属性更改为重复的对象:
var nameChangedDuplicates = duplicates.Select( s => {s.Name = s.Name + "something"; }).ToList();
如果您只想从列表中获取所有项目而不重复,则可以将Dinstinct()
方法应用于dflist
,该方法将返回IEnumerable<T>
结果:
var withoutDuplicates = dflist.Distinct();
而且,如果您想要List<T>
而不是IEnumerable<T>
,则必须使用ToList()
这样的方法:
var withoutDuplicates = dflist.Distinct().ToList();
您可以在以下页面中获得有关它的更多信息:
c# - How to get duplicate items from a list using LINQ?