Confrontare più array c#

martedì 29 marzo 2016 - 17.48
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows 7  |  Visual Studio 2010  |  SQL Server 2008 R2

belle Profilo | Newbie

ciao a tutti sto avendo un problema con il confronto di due o piu array.
io vorrei estrapolare solo le stringhe che risultano essere vere per tutti gli array e scriverli in una listbox.

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

AntCiar Profilo | Expert

ciao.

Non ho ben capito cosa devi fare per la precisione una volta riempiti i due array di stringhe.
Dacci più informazioni così posso aiutarti
Cristian Barca

Davide1986 Profilo | Junior Member

Penso che puoi risolvere il tuo dubbio con una giusta query SQL .

Comunque come ha detto "AntCiar" dacci più informazioni così possiamo aiutarti

Saluti Davide
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

E un programma di ricette che in base a dei check-box mi da una lista di ricette comuni a tutte le persone selezionate.
io non riesco a capire come fare un confronto delle ricette comuni, dopo aver scaricato le ricette per ognuno delle persone selezionate, in modo da avere una lista con solo quelle comuni.
intanto mi sa di aver detto una cavolata perché list non e un array vero?
comunque io scarico il codice in list, pero non so come confrontare queste due o più liste per fare uscire i valori comuni.



[code]List<string> RisultatoPrimo = new List<string>();
List<string> RisultatoCristina = new List<string>()

foreach (DataRow row in dt.Rows)
{
RisultatoPrimo.Add(Convert.ToString(row["NomeRicette"]));

}
foreach (DataRow row in dt.Rows)
{
RisultatoPrimo.Add(Convert.ToString(row["NomeRicette"]));

}
[code]

grazie mille e scusatemi se sembra banale ma sono alle prime armi

Davide1986 Profilo | Junior Member

Prova a fare una Query SQL cosi : "SELECT NomeRicette FROM Prova WHERE Primo = 'Y' AND Cristina = 'Y' " cosi ti appare la lista NomeRicette di entrambi che hanno in comune "Y".

Fammi sapere

Saluti Davide.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

ma cosi non appare sempre gli stessi risultati?
cioè come farei a dire seleziono persona 1 persona 2 persona 4, e persona 3 no, il risultato mi verrebbe sempre uguale?

Davide1986 Profilo | Junior Member

Fai una Query dinamica, nel senso che crei la stringa della query in base alle tue esigente e aggiungi le persone che vuoi .

Puoi crearti una lista dove aggiungi le persone che ti servono e poi ci fai un foreach per crearti la stringa SQL :

List<string> elencoPersone = new List<string>(); public void aggiungiPersona(string stringName){ this.elencoPersone.Add(stringName); } public void rimuoviPersona(string stringName){ this.elencoPersone.Remove(stringName); } public string createStringSQL(){ string strSQL = "SELECT NomeRicette FROM Prova WHERE "; foreach (string namePersona in this.elencoPersone) { strSQL += " "+ namePersona + "='Y' AND"; } //Elimino l'ultimo AND inserito strSQL.Remove(strlSQL.Length-3, 3); return strSQL; } //Alternativa aggiungi alla stringa questo public string addPersonSQL (string sqlOld, string strNomePersona){ return sqlOld + " AND " + strNomePersona + " = 'Y' " }

Non sapendo come hai creato il tuo Database e quello che ottieni dalla SELECT che fai , puoi fare un esempio che cosa hai nella lista1 e nella lista2 e di che cosa vuoi come risultato .

Saluti Davide
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

ciao ho provato come consigliato ma non restituisce nessun risultato, allego la foto del database che per il momento non e completo mancano altri nomi di persone e le ricette sono scritte solo per provare.

880x561 25Kb

intanto grazie mille

Davide1986 Profilo | Junior Member

A me il comando SQL che ti ho scritto funziona .

Intendo questa : "SELECT NomeRicette FROM Prova WHERE Primo = 'Y' AND Cristina = 'Y' "

Comunque prova con questo e fammi sapere e dimmi cosa stampa nella Console :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

intanto ti volevo ringraziare davvero tanto.
purtroppo mi da questo errore

271x222 8Kb

1230x505 86Kb

la parte di codice e questa
//Inserisco la prima persona strSQL = elencoPersone[0] + " = 'Y'";

Davide1986 Profilo | Junior Member

Prova a modificarlo cosi :

//Se è solo una persona if(elencoPersone.Count == 1){ return strSQL + elencoPersone.First()+ " = 'Y'"; } //altrimenti sono più di una persona //Inserisco la prima persona strSQL = strSQL + elencoPersone.First() + " = 'Y'";

alternativa se da errore

strSQL = strSQL + elencoPersone.ElementAt(0) + " = 'Y'";

Fammi sapere. Non ho sotto mano Visual Studio e non posso provare il codice.

Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

funziona scrive i risultati nella listbox.
solo che alcuni sono sbagliati, faccio vedere delle immagini cosi si capisce meglio.
I nomi delle ricette sono scritti a caso.

1318x682 70Kb

1356x670 70Kb

Davide1986 Profilo | Junior Member

Mi immagino che hai fatto una cosa del genere:

if (primo.Checked){ elencoPersone.Add("Primo"); }else{ elencoPersone.Remove("Primo"); } if (cristina.Checked){ elencoPersone.Add("Cristina"); }else{ elencoPersone.Remove("Cristina"); } if (marco.Checked){ elencoPersone.Add("Marco"); }else{ elencoPersone.Remove("Marco"); }


Mi dici quale stringa hai usato ?

Questa :

strSQL = strSQL + elencoPersone.ElementAt(0) + " = 'Y'";

oppure questa :

strSQL = strSQL + elencoPersone.First() + " = 'Y'";

Per capire se la Query la scrive giusta devi provare a richiamare la funzione creaSQL e vedere cosa restituisce :

public void stampaStringaConsole(){ string strSQL = creaSQL(elencoPersone); Console.WriteLine("Risultato query => " + strSQL); }


esegui questa funzione e poi leggi nella Console il risultato e me lo puoi postare cosi posso verificare perché da errore?

TROVATO L'ERRORE DEVI MODIFICARE COSI IL CICLO DEL FOR :

Prima della modifica

//ciclo dalla seconda in poi for (int i = 1; i < elencoPersone.Count-1; i++){ strSQL = addPersonSQL(strSQL , elencoPersone[i]); }

Dopo la modifica :
//ciclo dalla seconda in poi for (int i = 1; i < elencoPersone.Count; i++){ strSQL = addPersonSQL(strSQL , elencoPersone[i]); }

Usa questo codice :

//Se è solo una persona if(elencoPersone.Count == 1){ return strSQL + elencoPersone[0] + " = 'Y' "; } //altrimenti sono più di una persona //Inserisco la prima persona strSQL = strSQL + elencoPersone[0] + " = 'Y'"; //ciclo dalla seconda in poi for (int i = 1; i < elencoPersone.Count; i++){ strSQL = addPersonSQL(strSQL , elencoPersone[i]); }

Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

funziona veramente non so come ringraziarti sei stato gentilissimo

ho usato questa stringa
strSQL = strSQL + elencoPersone.ElementAt(0) + " = 'Y'";
pero non ho ben capito la questione di quel - 1
for (int i = 1; i < elencoPersone.Count-1; i++)
, e come se togliesse sempre una persona dalla lista?

Davide1986 Profilo | Junior Member

Non toglie nessuna persona .

Provo a spiegartelo in maniera rozza e veloce :

Tu hai una lista elencoPersone cosi formata

elencoPersona(0) = "Marco"; //prima posizione
elencoPersona(1) = "Mario"; //seconda posizione

con la funzione elencoPersone.Count ottengo il valore 2

con il comando elencoPersone.Count-1 ottengo il valore 1

ma io il for sto partendo dall'indice 1 perché devo escludere il primo elemento e quindi quando va a verificare (i<elencoPersone.Count-1) lui esce perché fa la seguente verifica (1<1 = false) ed esce dal for

Codice errato :

for (int i = 1; i < elencoPersone.Count-1; i++){ Console.WriteLine("i = " + i); }

Codice giusto :

for (int i = 1; i <= elencoPersone.Count-1; i++){ Console.WriteLine("i = " + i); }

Altrimenti per semplicità usi che quando è arrivato a 2 esce dal for dopo aver verificato gli indici 0 - 1

for (int i = 1; i < elencoPersone.Count; i++){ Console.WriteLine("i = " + i); }

Saluti Davide

P.S. Se ho risposto alla tua domanda ricordati di accettare la mia risposta.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.imaginsystems.it
http://www.alpacasrl.it

belle Profilo | Newbie

sei stato chiarissimo grazie ancora

belle Profilo | Newbie

Ciao scusa se disturbo ancora. Il programma è finito però ,mi piacerebbe farlo diventare un programma universal app ma non capisco bene come utilizzare sqlite.
Per adesso sono riuscito a creare una connessione utilizzando SQLitePCL, ma visto che non esistono i comandi datatable, dataAdapter e Rows,come faccio a modificare la ricerca?


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questa è la parte che non capisco come modificare


Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5