Permalänk
Medlem

linjär sökning

får inte ihop hur man använder Contain metoden för att söka efter en sträng i en lista med vektorer ,

List<string[]> nameList = new List<string[]> ();
string[] naMn = new string[2];

case 3:

Console.Write("Skriv in förnamnet du söker efter ");
string sökOrd = Console.ReadLine();

foreach (var item in nameList)
{
if (nameList.Contains(sökOrd)) ;
Console.WriteLine(nameList);
}

break;

vill allså använda ett sökord för att hitta någon vektor i listan,
( om någon har en bra video eller något där dom förklarar hur man ska använda contains så länka gärna )

Permalänk
Medlem

Jag tror att du gör det för svårt för dig. Förstår du vad det är som du ska lösa?
nameList är en lista med objekt av typen string[] och var och en av dessa objekt innehåller i sin tur ett eller flera ord.

Vet du hur du löser problemet i en dimension, d.v.s. hur hittar du ett ord i en lista med flera om du ska leta i en string[]?

Permalänk
Medlem

Item bör ju vara objekt av typen sträng. Contains() tillhör String objektet. Läser man på C# docs så står det:

Return Value
Type: System.Boolean

true if the value parameter occurs within this string, or if value is the empty string (""); otherwise, false.

D.v.s. item.Contains('något ord') inte nameList.contains. Sen kan du göra kontroll för tom sträng om du behöver det.

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

Contains är en metod som tillhör List, se https://msdn.microsoft.com/en-us/library/bhkz42b3(v=vs.110).a... .

Eftersom du har ett List-objekt med strängvektorer så kommer contains att acceptera just en strängvektor som argument som den sedan kommer att försöka matcha med något som ligger i nameList. Det du gör nu är att loopa igenom alla objekt i nameList med din foreach men du använder dig inte av loopvariabeln (item) utan undersöker om nameList innehåller en sträng som användaren får skriva in, vilket enligt definitionen av metoden inte kommer fungera korrekt.

Så tänk efter vad du egentligen är ute efter. Vill du undersöka om nameList innehåller en viss vektor eller vill du leta efter ett visst objekt i en av vektorerna som ligger i nameList?

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem

Byt bara ut ”nameList” i if-satsen mot ”item” så bör du vara i mål.
(Bortsett från att din output är rätt intetsägande)

Permalänk
Medlem

@BasseBaba: Då får jag bara ut System.Collections.Generic.List`1[System.String[]]

Permalänk
Medlem

@mmolder: det jag vill få fram är ju förnamnet om ja spara för och efternamn i en vektor sedan sparar vektorn i listan så vill jag kunna söka t.ex Patrik och om då jag har sparat en vektor med förnament Patrik i så skrivs den ut ,

Permalänk
Medlem

if (item.Contains(sökOrd)) ;
Console.WriteLine(item);

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

@Xeno88: då får jag bara ut, System.strin[]

om jag ger den någon plats i listan så funkar det , item.[0].Contains men hur får jag så den går igenom fler platser och inte bara den jag indikerar

Permalänk
Medlem
Skrivet av Tjerna:

@Xeno88: då får jag bara ut, System.strin[]

om jag ger den någon plats i listan så funkar det , item.[0].Contains men hur får jag så den går igenom fler platser och inte bara den jag indikerar

List<string[]> nameList = new List<string[]> ();

Jaha, du har gjort varje item en array av string objekt. Det ska du inte behöva göra. Gör en sträng per rad.

List<string> nameList = new List<string> ();

Visa signatur

R7-3700X, B450M Mortar MAX, 32GB DDR4 @ 3200, RTX 2080, Corsair CX650M Rev2

Permalänk
Medlem

Tja i så fall får du köra t ex nästade foreachloopar
Nått i denna stilen borde funka

foreach(var list in nameList){ foreach(var entry in list){ if(entry.Contains(sökOrd){ Console.WriteLine(entry); } } }

Permalänk
Medlem

Okej, om jag förstår dig rätt så vill du lagra ett antal strängar i en vektor, tex. för och efternamn och sedan lagra dessa vektorer i en lista. Sedan vill du kunna skriva in en sträng och söka igenom varje vektor för att se om den innehåller det inskrivna ordet och om så är fallet skriva ut hela innehållet i den vektorn som det blev träff i?
Vad händer om du testar följande:

foreach (var item in nameList) { if (item.Contains<String>(sökOrd)) { foreach (string x in item) { Console.Write(x); } } }

Detta bör göra det scenario jag beskrivet ovan.

Visa signatur

Skoj: Ryzen 9 5900x, RTX 3080, 32 GB RAM @3200MHz CL16
Jobb: Alienware M15 R6, RTX 3080, 32 GB RAM
Privat: Macbook Pro 13" late 2016

Permalänk
Medlem

Ja, förutom att formateringen på utskriften kanske inte blir den bästa.

Permalänk
Medlem

fick allt och funka men tydligen ska inte användas oss av Contains ska använda jämförelseoperatorn == , hm

måste jag inte då först göra en for loop för att få ut vektorerna sedan en till for loop för att få ut string i vektorerna ? någon som har någon bra start ? , hade verklingen satt in me på Contains haha..

Permalänk
Medlem

Början på lösningen finns i mmolder's sista post.

Permalänk
Medlem

Du använder inte contains eftersom den helt enkelt kollar om din sträng existerar i arrayen. Säg att du har två namn, "Mikael" och "Mikaela". Om jag hade använt contains och skrivit "Mikael" så hade jag fått fram både "Mikael" och "Mikaela" eftersom båda innehåller "Mikael". Detta är även sant om jag hade Skrivit "M", då hade jag fått fram alla som innehåller just ett "M".

Du behöver heller inte loopa en andra gång för att få fram namn eller efternamn utan kan helt enkelt skapa en till string list och stopp in resultatet från loopen. En loop är bättre om du inte vet hur många element som existerar inuti resultatet.

Utan loop

std::string userInput = ""; std::cin >> userInput; std::vector<std::vector<std::string>> namnEfternamn; std::vector<std::string> namn; for (int i = 0; i < namnEfternamn.size(); i++) { namn = namnEfternamn[i]; if (toLowerCase(namn[0]) == userInput || toLowerCase(namn[1]) == userInput) { std::cout << namnEfternamn[i][0] << " " << namnEfternamn[i][1] << "\n"; } }

Dold text

Med loop

std::string userInput = ""; std::cin >> userInput; std::vector<std::vector<std::string>> namnEfternamn; std::vector<std::string> namn; std::vector<int> results; for (int i = 0; i < namnEfternamn.size(); i++) { namn = namnEfternamn[i]; std::string s; for (int i2 = 0; i2 < namn.size(); i2++) { s = namn[i2]; if (toLowerCase(s) == userInput) { if (std::find(results.begin(), results.end(), i) == results.end()) { results.push_back(i); } } } } for (int i = 0; i < results.size(); i++) { namn = namnEfternamn[results[i]]; std::string s; for (int i = 0; i < namn.size(); i++) { s = namn[i]; std::cout << s << " "; } std::cout << "\n"; }

Dold text

Ber om ursäkt att det inte är c#.

Permalänk
Medlem
Skrivet av Tekoppar:

Du använder inte contains eftersom den helt enkelt kollar om din sträng existerar i arrayen. Säg att du har två namn, "Mikael" och "Mikaela". Om jag hade använt contains och skrivit "Mikael" så hade jag fått fram både "Mikael" och "Mikaela" eftersom båda innehåller "Mikael". Detta är även sant om jag hade Skrivit "M", då hade jag fått fram alla som innehåller just ett "M".

Fast det stämmer inte. (new string[] {"ab", "abc"}).Contains("a") kommer ge false.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Tjerna:

fick allt och funka men tydligen ska inte användas oss av Contains ska använda jämförelseoperatorn == , hm

måste jag inte då först göra en for loop för att få ut vektorerna sedan en till for loop för att få ut string i vektorerna ? någon som har någon bra start ? , hade verklingen satt in me på Contains haha..

Du vet ju redan datastrukturen för varje person. Då borde du bara behöva en loop och i loopen kan du komma åt för- och efternamn med item[0] och item[1].

foreach (var item in nameList)
{
if (item[0] == sökOrd || item[1] == sökOrd);
Console.WriteLine(item[0] + " " + item[1]);
}

Visa signatur

Windows 11 Pro | Intel i7 8700 | ASUS Prime Z370-P | Corsair 16GB 3000MHz | ASUS GTX 1080 | Fractal Design Define S | Corsair RM750x | Hyper 212 EVO

Permalänk
Medlem
Skrivet av Teknocide:

Fast det stämmer inte. (new string[] {"ab", "abc"}).Contains("a") kommer ge false.

Menade självklart om han loopar arrayen och kör Contains på varje element och inte Contains på själva arrayen. Ber om ursäkt om det misstogs som det.

Skickades från m.sweclockers.com

Permalänk
Medlem

Ett annat alternativ är att använda System.Linq, men det är ju lite överkurs och antagligen inte vad kursledaren tänkt...

using System.Linq; . . . var namnParLista = new List<string[]> { new [] { "Swe","Clockers"}, new [] { "Swe", "Droid" } }; var sökOrd = "Clockers"; foreach (var namnPar in namnParLista.Where(np => np.Any(n => n == sökOrd))) { Console.WriteLine($"{namnPar[0]} {namnPar[1]}"); }

Permalänk
Medlem
Skrivet av Tekoppar:

Menade självklart om han loopar arrayen och kör Contains på varje element och inte Contains på själva arrayen. Ber om ursäkt om det misstogs som det.

Skickades från m.sweclockers.com

Då är jag med

Visa signatur

Kom-pa-TI-bilitet