![](/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.