![](/img/trans.png)
[英]Remove items from a List that are in another List by specific property with grouping
[英]Grouping and remove from list
我有以下类型
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);
}
}
}
我需要按名称分组,但只有在存在该名称的路径和查询时才会删除。 请建议我如何以其他方式做? 谢谢
我需要按名称分组,但只有在存在该名称的路径和查询时才会删除。 请建议我如何以其他方式做?
如果我假设这句话与此相同:
如果且仅当存在具有相同
Name
和PathType="path"
的另一个参数时,如何从集合中删除具有PathType="query"
的参数?
然后你可以用这个声明来做:
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)));
您可以使用此LINQ语句执行此操作:
var cleanedParams = params.Where(p => p.PathType != "query" ||
!params.Any(p2 => p2.Name == p.Name && p2.PathType != "query")).ToList();
我很难理解你的问题,因为它没有得到很好的陈述。 所以这就是我所理解的。 它有两个问题: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();
如果我误解了你的问题,请告诉我。
好吧,首先,你不能使用params
作为变量的名称,因为它是C#指令。
下一个。 据我所知你想要有周期。 好吧,正如我上面提到的,你不能修改foreach
循环体内的集合(在你的情况下为papram
)。 你可以使用这样的东西:
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
。
我似乎找到了解决方案。 我的代码:
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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.