Gå til innhold

Hvordan spørre alle strings


Anbefalte innlegg

Skrevet

Sliter med å lage en condition som sier at hvis alle strings møter kriteriet mitt, så gjør ett eller annet.

       if  ((status == "OK"))
                    {
                        // Do something
                        
                    }

Det jeg har kommet opp med blir feil, nå gjør den ett eller annet hvis en av stringene er OK. Jeg vil at den skal gjøre noe hvis ALLE stringene er OK.

Dette er basicly en hardwaresjekk og jeg sjekker om statusen på alle enhetene er ok.

 

Her er hele koden hvis noen er interessert:

 // Hardware check

            ManagementObjectSearcher deviceList =
    new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

           
            if (deviceList != null)
                
                foreach (ManagementObject device in deviceList.Get())
                {
                    
                    
                    string status = device.GetPropertyValue("Status").ToString();

                    
                    bool working = ((status == "OK") || (status == "Degraded")
                        || (status == "Pred Fail"));

                    if  ((status == "OK"))
                    {
                        // Do something
                        
                    }
else
{ // Do something else
}
                 
                    
                }
Videoannonse
Annonse
Skrevet

Viss kodeblokken kun skal gjøres om alle strengene er ok, kan den ikke være inne i foreach-løkken.
Du kan f.eks lage en bool allIsOk som blir false viss noen av statusene er ulik ok og ha en if blokk etter løkken. Poenget er uansett at du sjekker om en eller flere er false, for det er det motsatte av at alle er ok.

Skrevet

Viss kodeblokken kun skal gjøres om alle strengene er ok, kan den ikke være inne i foreach-løkken.

Du kan f.eks lage en bool allIsOk som blir false viss noen av statusene er ulik ok og ha en if blokk etter løkken. Poenget er uansett at du sjekker om en eller flere er false, for det er det motsatte av at alle er ok.

 

Kunne du gitt meg et lite eksempel? Sliter med å skjønne konkret hvordan jeg skriver det slikt.

Skrevet

if (deviceList != null){
bool allIsOK = true;

foreach (ManagementObject device in deviceList.Get())
{
string status = device.GetPropertyValue("Status").ToString();

bool
working = ((status == "OK") || (status == "Degraded")
|| (status == "Pred Fail"));

if(status!="OK"){
allIsOk = false;

}
}
// Utenfor foreach løkken
if ((allIsOk))
{
// Do something
}
else
{
// Do something else
}

Vet ikke hvordan du hadde tenkt å bruke "working" , men du kan også bruke den istedet for allIsOk ( dårlig navn ) om du forandrer litt på den


Skrevet

if (deviceList != null){

bool allIsOK = true;

foreach (ManagementObject device in deviceList.Get())

{

string status = device.GetPropertyValue("Status").ToString();

bool working = ((status == "OK") || (status == "Degraded")

|| (status == "Pred Fail"));

 

if(status!="OK"){

allIsOk = false;

}

}

// Utenfor foreach løkken

if ((allIsOk))

{

// Do something

}

else

{

// Do something else

}

 

Vet ikke hvordan du hadde tenkt å bruke "working" , men du kan også bruke den istedet for allIsOk ( dårlig navn ) om du forandrer litt på den

 

 

 

Funker ikke helt, får at allisok er out of context siden den er utenom foreach.

Men finnes det ikke noe som

 

if (status.All == "OK") ?

Skrevet (endret)

var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var allIsOk = deviceList.Get().Cast<ManagementObject>().All(device => (string)device.GetPropertyValue("Status") == "OK");
				
if(allIsOk)
{
  // Do something
}
Her er en som fjerner alle elementer uten status også:

 

var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var statuses = from device in deviceList.Get().Cast<ManagementObject>()
				let status = (string)device.GetPropertyValue("Status")
				where !string.IsNullOrEmpty(status)
				select status;

var isAllOk = statuses.All(status => status == "OK");
				
if(allIsOk)
{
  // Do something
}
Noe kode som skriver ut mer info:

 

var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var statuses = from device in deviceList.Get().Cast<ManagementObject>()
				let status = (string)device.GetPropertyValue("Status")
				where !string.IsNullOrEmpty(status)
				select new { Status = status, Name = (string)device.GetPropertyValue("Name") };

var isAllOk = statuses.All(device => device.Status == "OK");
				
Console.Write("Is all OK? ");
Console.WriteLine(isAllOk ? "Yes!" : "No.");

foreach(var device in statuses.Where(d => d.Status != "OK"))
	Console.WriteLine("{0}: {1}", device.Name, device.Status);
Endret av GeirGrusom
Skrevet

 

Funker ikke helt, får at allisok er out of context siden den er utenom foreach.

Men finnes det ikke noe som

 

if (status.All == "OK") ?

 

Du må deklarere allIsOk før foreach løkken

Skrevet
var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var allIsOk = deviceList.Get().Cast<ManagementObject>().All(device => (string)device.GetPropertyValue("Status") == "OK");
				
if(allIsOk)
{
  // Do something
}
Her er en som fjerner alle elementer uten status også:

 

var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var statuses = from device in deviceList.Get().Cast<ManagementObject>()
				let status = (string)device.GetPropertyValue("Status")
				where !string.IsNullOrEmpty(status)
				select status;

var isAllOk = statuses.All(status => status == "OK");
				
if(allIsOk)
{
  // Do something
}
Noe kode som skriver ut mer info:

 

var deviceList = new ManagementObjectSearcher("Select Name, Status from Win32_PnPEntity");

var statuses = from device in deviceList.Get().Cast<ManagementObject>()
				let status = (string)device.GetPropertyValue("Status")
				where !string.IsNullOrEmpty(status)
				select new { Status = status, Name = (string)device.GetPropertyValue("Name") };

var isAllOk = statuses.All(device => device.Status == "OK");
				
Console.Write("Is all OK? ");
Console.WriteLine(isAllOk ? "Yes!" : "No.");

foreach(var device in statuses.Where(d => d.Status != "OK"))
	Console.WriteLine("{0}: {1}", device.Name, device.Status);

 

Fungerer veldig bra, sliter med at enheter dukker opp som IKKE "OK" som er helt grei. Har driver, kjører og ingen error som jeg kan se. Men det har ingenting med tråden her å gjøre, det får jeg finne ut av. Takk skal du ha :)

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...