分组并从列表中删除

时间:2017-07-04 08:57:20

标签: c# .net list linq

我有以下类型

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

我的参数列表如:

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

我需要查找具有相同Name的参数(例如:CD),其中PathType等于pathquery 。对不起我的英语,这有点难以解释。我想找到

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

然后删除所有PathType = "query"。最后结果应该是

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

我的代码

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

我需要按名称分组,但只有在存在该名称的路径和查询时才会删除。 请建议我如何以其他方式做?感谢

5 个答案:

答案 0 :(得分:3)

  

我需要按名称分组,但只有在存在该名称的路径和查询时才会删除。请建议我如何以其他方式进行?

如果我认为这句话与此相同:

  

如何从集合中删除带有PathType="query"的参数,当且仅当其他参数具有相同的Name和{{1}时}?

然后你可以用这句话来做:

PathType="path"

<强>更新

对于不区分大小写的比较(在params.RemoveAll(o => o.PathType == "query" && params.Any(p => p.Name == o.Name && p.PathType == "path")); 上):

PathType

答案 1 :(得分:1)

你可以用这个LINQ语句来做到这一点:

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

答案 2 :(得分:1)

我很难理解你的问题,因为它没有得到很好的陈述。 所以这就是我所理解的。它有两个问题: Q1。返回那些具有重复名称的条目(例如c和d),其中pathType具有值查询或路径,就像您在预期结果中提到的那样。

$get_day = strtotime('2017-07-03');
echo $day = date('l', $get_day);

如果是,你可以得到它:

---
title: "Untitled"
output: beamer_presentation
theme: "metropolis"
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)
```

##  {.standout}
Questions?

Q2。从列表中获取pathType ==“query”或pathType ==“path”的条目。

如果是,这里是代码:

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

如果我误解了你的问题,请告诉我。

答案 3 :(得分:0)

首先,你不能使用params作为变量的名称,因为它是C#指令。

下一步。据我所知你想要有周期。好的,正如我上面提到的,你不能修改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

答案 4 :(得分: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);
        }
    }
}