我有以下类型
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
的参数(例如:C
和D
),其中PathType
等于path
和query
。对不起我的英语,这有点难以解释。我想找到
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);
}
}
}
我需要按名称分组,但只有在存在该名称的路径和查询时才会删除。 请建议我如何以其他方式做?感谢
答案 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);
}
}
}