C# LINQ vybrat prvek z pole řetězec

0

Otázka

Mám řetězec:

private const string Codes = "2,10";

public void method()
{
    var displayCodes = Codes.Split(',');
    DemoResponse response = webService.GetResponse();  //getting response from API

    if(response.Errors.Any(x => displayCodes.Contains(x.StackTrace))
    {
         int myCode = int.Parse(response.Errors.Select(x => x.StackTrace).FirstOrDefault());
    }
}

To je "DemoResponse" modelu:

public class DemoResponse
{
     public bool Validate { get; set; }
     public IEnumerable<ErrorResponse> Errors { get; set; }
}

public class ErrorResponse
{
     public string Message { get; set; }
     public string StackTrace { get; set; }
}

Na DemoResponse "odpověď" z API vrátí výsledek jako: (například)

 { 
    "Validate" : false,
    "Errors" : 
             {
                "Message" : "test1",
                "StackTrace" : "2"
             }
  }
  { 
     "Validate" : false,
     "Errors" : 
             {
                "Message" : "test1",
                "StackTrace" : "2"
             }
  }
  { 
     "Validate" : false,
     "Errors" : 
             {
                "Message" : "test1",
                "StackTrace" : "95"
             }
  }

Na DemoResponse "odpověď" bude vždy obsahovat pouze jeden kód z const string "Kódy", jsem.e buď 2 nebo 10. Ale může obsahovat další kódy.

Pokud DemoResponse "odpověď" obsahuje kód 2 jako první Kód, pak tato linka funguje:

int myCode = int.Parse(response.Errors.Select(x => x.StackTrace).FirstOrDefault());

Ale pokud DemoResponse "odpověď" nemá kód 2 jako první, a pak, jak to mám napsat LINQ vyberte Kód 2 a přiřadit k "myCode" proměnné? Například:

  "StackTrace" : "95",
  "StackTrace" : "95",
  "StackTrace" : "2"
asp.net asp.net-core c# linq
2021-11-23 02:20:50
2
-1

Je třeba přidat pro každou smyčku uvnitř, pokud podmínka.

private const string Codes = "2,10";

public void method()
{
    var displayCodes = Codes.Split(',');
    DemoResponse response = webService.GetResponse();  //getting response from API

    if(response.Errors.Any(x => displayCodes.Contains(x.StackTrace))
    {
        foreach (ErrorResponse item in response.Errors)
        {
          // write your logic based on your requirement

          if(int.Parse(item.StackTrace) == 2)
          {
          int myCode = int.Parse(item.StackTrace);
          }
        }
    }
}
2021-11-23 06:05:27

Mohu nastavit pouze jednu hodnotu na "myCode" proměnné. Snažil jsem se to - int myCode = int.Parse(response.Errors .Where(x => displayCodes.Contains(x.StackTrace)).Select(x => x.StackTrace).FirstOrDefault());
DevP

Jak na vaši otázku, požadované StackTrace=2 hodnotu jako 1. prioritu přiřadit do mycode proměnné přímo? tam je více možností jak na vás jako 2,95,95 nebo 95,95,2 nebo 95,2,95. Tak za 1. funguje ve vašem kódu. nyní pro 2. a 3 scénáře, můžete jít s foreach a navíc podmínky, jako kdyby StackTrace=2, pak přiřadit k mycode jiného není. zkontrolujte aktualizováno odpověď na stejné
Malvik Bhavsar

LINQ to může zvládnout velmi snadno, foreach smyčka je zbytečná.
NetMage
-1

Zdá se mi, že to, co jsi chtěl získat formou API je pole informací, ale v kódu jsou mapování, co obdržíte od API do jednoho objektu typu DemoResponse. Mám podezření, že ty vlastně chceš response být seznam nebo pole DemoResponses.

Navíc, z mého chápání na následující otázku:

Ale pokud DemoResponse "odpověď" nemá kód 2 jako první, a pak, jak to mám napsat LINQ vyberte Kód 2 a přiřadit k "myCode" proměnné?

, chcete přiřadit první StackTrace hodnotu, která odpovídá některé kódy v Codes, myCode; spíše než přiřazení jakéhokoliv StackTrace hodnotu myCode.

Pokud tyto dva předpoklady jsou správné, můžete zkusit následující:

private const string Codes = "2,10";

public void method()
{
    var displayCodes = Codes.Split(',');

    // NOTE: response is now an array of DemoResponse; 
    // GetResponse()'s implementation and return type may need to be rewritten accordingly
    DemoResponse[] response = webService.GetResponse();

    var errors = response.SelectMany(r => r.Errors);
    
    if (errors.Any(x => displayCodes.Contains(x.StackTrace)))
    {
        int myCode = int.Parse(errors.Select(x => x.StackTrace).First(s => displayCodes.Contains(s)));
    }
}

Alternativně, můžete se podívat smyčka přes stack traces spíše než chyby:

var stackTraces = response.SelectMany(r => r.Errors).Select(e => e.StackTrace);
    
if (stackTraces.Any(s => displayCodes.Contains(s)))
{
    int myCode = int.Parse(stackTraces.First(s => displayCodes.Contains(s)));
}
2021-11-23 05:22:58

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................