簡體   English   中英

分組並從列表中刪除

[英]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參數(如: 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);
        }
    }
}

我需要按名稱分組,但只有在存在該名稱的路徑和查詢時才會刪除。 請建議我如何以其他方式做? 謝謝

我需要按名稱分組,但只有在存在該名稱的路徑和查詢時才會刪除。 請建議我如何以其他方式做?

如果我假設這句話與此相同:

如果且僅當存在具有相同NamePathType="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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM