Group and remove from list

I have the following type

public class Parameter
{
   public string Name {get;set;}
   public string PathType {get;set;}
}

A list of my parameters, for example:

List<Parameter> params = new List<Parameter>();
params.Add(new Parameter{ Name ="A", PathType ="path" });
params.Add(new Parameter{ Name ="B", PathType ="query" });
params.Add(new Parameter{ Name ="C", PathType ="path" });
params.Add(new Parameter{ Name ="C", PathType ="query" });
params.Add(new Parameter{ Name ="D", PathType ="path" });
params.Add(new Parameter{ Name ="D", PathType ="query" });
params.Add(new Parameter{ Name ="D", PathType ="body" });

I need to find parameters that have the same ones Name(for example: Cand D), where PathTypeis equal to pathand query. Sorry for my English, this is a little hard to explain. I want to find

 Name ="C", PathType ="path"
 Name ="C", PathType ="query"
 Name ="D", PathType ="path"
 Name ="D", PathType ="query"

Then delete everything where PathType = "query". Finally, the result should be

Name ="A", PathType ="path" 
Name ="B", PathType ="query"
Name ="C", PathType ="path" 
Name ="D", PathType ="path" 
Name ="D", PathType ="body" 

My code

var groupedParams = params.GroupBy(a => a.Name, StringComparer.InvariantCultureIgnoreCase).ToDictionary(t => t.Key);
foreach (var parameter in params) {
    if (groupedParams.ContainsKey(parameter.Name)) {
        var temp = groupedParams[parameter.Name];
        if (temp.Count(x => x.PathType.ToLower() == "path") == 1 && temp.Count(x => x.PathType.ToLower() == "query") == 1) {
            params.Remove(parameter);
        }
    }
}

I need to group by name, but only delete when there is a path and query for that name. Please suggest how can I do it in another way? Thanks

+4
source share
5 answers

, , . , , ?

, :

PathType="query" , Name PathType="path"?

:

params.RemoveAll(o => o.PathType == "query" && params.Any(p => p.Name == o.Name && p.PathType == "path"));

( PathType):

params.RemoveAll(o => o.PathType.Equals("query", StringComparison.OrdinalIgnoreCase) && params.Any(p => p.Name == o.Name && p.PathType.Equals("path", StringComparison.OrdinalIgnoreCase)));
+2

LINQ:

var cleanedParams = params.Where(p => p.PathType != "query" ||
    !params.Any(p2 => p2.Name == p.Name && p2.PathType != "query")).ToList();
+1

, , . , . 2 : Q1. , (, c d), pathType , .

Name ="C", PathType ="path"
Name ="C", PathType ="query"
Name ="D", PathType ="path"
Name ="D", PathType ="query"

, :

var filteredList = param.Where(x => x.PathType == "query" || x.PathType == "path").ToList();
//Below list will have result.
var duplicateNameList = filteredList.GroupBy(x => x.Name).Where(x => x.Count() > 1).ToList();

Q2. , pathType == "query" pathType == "path".

, :

 var result = param.Where(x => x.PathType != "query" && x.PathType!="path").ToList();

, .

+1

, -, params , #.

. , . , , (papram ) foreach. - :

var groupedParams = _params.GroupBy(a => a.Name, StringComparer.InvariantCultureIgnoreCase).ToDictionary(t => t.Key);
int i = 0;
while (i != _params.Count)
{
    if (groupedParams.ContainsKey(parameter.Name))
    {
        var temp = groupedParams[parameter.Name];
        if (temp.Count(x => x.PathType.ToLower() == "path") == 1 && temp.Count(x => x.PathType.ToLower() == "query") == 1)
        {
            params.RemoveAt(i);
            continue;
        }
    }
    i++;
}

params _params, . params Parametr[] _params.Count _params.Length.

0

, . :

var paramList = params.Where(x => x.PathType.Equals("path") || x.PathType.Equals("query"));
var groupedParams  = paramList.GroupBy(a => a.Name, StringComparer.InvariantCultureIgnoreCase).ToDictionary(t => t.Key);
foreach (var item in groupedParams) {
    var temp = item.Value.Count() > 1;
    if (temp) {
        var paramToDelete = operation.parameters.FirstOrDefault(x => x.Name.ToLower() == item.Key.ToLower() && x.PathType == "query");
        if (paramToDelete != null) {
            operation.parameters.Remove(paramToDelete);
        }
    }
}
0

Source: https://habr.com/ru/post/1680699/


All Articles