使用Dictionary <string,list <object>&gt;中的唯一字符串替换重复项。

时间:2018-05-03 11:55:44

标签: c# linq

我有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;所以它将是独一无二的。

1 个答案:

答案 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?

Enumerable.DistinctMethod (IEnumerable)

C# - Update all objects in a collection using LINQ