Jag har ett väl fungerande vb-script, som jag skulle behöva ha hjälp med att översätta: Har du färre än 10 stycken så är det klart att det aldrig funkar. Niklas. Kan inte .NET tillräckligt väl för att kunna alla begreppen. I princip är det någon som heter "list" som du ska använda. Jag har lyckats få ihop det så här: Hehe... det blev nästan som jag sa... =) Hej Niklas, och tack för utförligt svar. > I princip så menar jag att du ska göra något i stil med (pseudokod): Du kan skriva något sånt här:Problem med att convertera array till asp.net(C#)
<code>
Randomize
Dim Urval(10)
' Antal hittills utvalda
Antal_valda = 0
' Håll på tills vi valt 10 stycken
While Antal_valda < 10
' Välj ett tal
' Slumptal = Int(Rnd * 100) + 1
Slumptal = Int(Rnd * rst("maxid")) + 1
' Finns talet redan?
Finns_redan = false
For i = 1 to Antal_valda
If Slumptal = Urval(i) Then
' Talet fanns redan
Finns_redan = true
Exit For
End If
Next
' Om talet inte fanns, lägg det i Urval'
If Not Finns_redan Then
Antal_valda = Antal_valda + 1
Urval(Antal_valda) = Slumptal
End If
Wend
Session("Urval") = Urval(10)
</code>
När det gäller att få fram ETT slumptal så har jag löst det så här:
<code>
sql = "SELECT MAX(id) AS maxid FROM Quize";
DataSet ds1 = new DataSet();
OleDbDataAdapter Adapter1 = new OleDbDataAdapter();
Adapter1.SelectCommand = new OleDbCommand(sql, DBConn);
Adapter1.Fill(ds1, "Quize");
string id = ds1.Tables["Quize"].Rows[0]["maxid"].ToString();
Random randomNumber = new Random();
slumpTal = randomNumber.Next(1, Convert.ToInt32(id));
</code>
Men hur jag sen än gör, så kommer jag galet.
[REDIGERAT]
Nu försöker jag så här:
<code>
int[] Urval = new int [10];
int antalValda=0;
int slumpTal=0;
while (antalValda < 10)
{
Random randomNumber = new Random();
slumpTal = randomNumber.Next(1, Convert.ToInt32(id));
for (int i = 0; i < antalValda; i++)
{
if (slumpTal != Urval[i])
{
antalValda = antalValda + 1;
Urval[antalValda] = slumpTal;
}
}
</code>
Nu får jag inga fel, men sidan laddas inte upp, den "tänker" hela tiden.Sv: Problem med att convertera array till asp.net(C#)
Det rimliga att göra är att ha någon slags lista, fylla den med alla möjliga nummer och sen dra 10 ur den listan.Sv:Problem med att convertera array till asp.net(C#)
Skulle du tänka dig att förklara lite närmare?Sv: Problem med att convertera array till asp.net(C#)
Eller så kan du göra två vektorer, en med bool för "är redan vald", och sen gå igenom den. Den metoden du använder är felbenägen och det är nog därför det går som det går.
Är trött som fan, men i korthet menar jag med listan följande:
Du börjar med en lista [1, 2, 3, 4, 5, ... 20]
Sen väljer du ett element slumpvis, säg 7, du får då listan [1, 2, 3, ... 6, 8, 9, ... 20]
Sen fortsätter du så tills du har tömt listan.Sv:Problem med att convertera array till asp.net(C#)
<code>
string sql = "SELECT MAX(id) AS maxid FROM Quize";
string conn = Webbutill.dataConn(Request.ServerVariables["SERVER_NAME"]);
DBConn = new OleDbConnection(ConfigurationManager.ConnectionStrings[conn].ConnectionString);
OleDbCommand myCommand = new OleDbCommand(sql, DBConn);
int max = 0;
using (DBConn)
{
DBConn.Open();
max = (int)myCommand.ExecuteScalar();
}
if (max == 0)
try { }
catch
{
throw;
}
List<int> col = new List<int>();
Random rnd = new Random();
for (int i = 0; i < 10; i++)
{
int x;
do
{
x = rnd.Next(1, max);
}
while (col.Contains(x));
col.Add(x);
}
foreach (int i in col)
Response.Write(i.ToString() + "<br/>");
</code>
Detta fungerar kanonbra.Sv: Problem med att convertera array till asp.net(C#)
Men bakvänt.
Så som du gör nu kan du använda vad som helst istället för list där du har "contains".
Problemet med koden är om du tar bort en post. Då kommer ett av id-numren inte funka.
I princip så menar jag att du ska göra något i stil med (pseudokod):
<code>
list idnummer = db.get("SELECT ID FROM Quize")
vector desomsparas;
for(i = 0; i<10; i++){
index = random();
desomsparas[i] = idnummer[index];
idnummer.remove[index];
}
print(desomsparas);
</code>
Du slipper alltså leta bland det du har, och det går därför fortare.
Den andra varianter är något i stil med:
<code>
vector<int> idnummer = db.get(samma som ovan);
vector<bool> choosen = lika lång som idnummer, fylld med false;
vector<int> valda;
int count=0;
while(count<10){
index = random;
if(choosen[index]==false){
choosen[index] = true;
count++;
}
}
for(i = 0; i< choosen.length(); i++)
if(choosen[i])
print(idnummer);
</code>
eller så kör du print i loopen, eller så lägger du över dem i en separat:
<code>
while(count<10){
index = random;
if(choosen[index]==false){
choosen[index] = true;
valda[count] = index;
count++;
}
}
//och du kan nu använda "valda"
</code>
PS. Om du tänker på det engelska ordet för "frågesport", så stavas det "quiz", utan "e".Sv:Problem med att convertera array till asp.net(C#)
Jag bara funderar på det här:
<code>
db.get("SELECT ID FROM Quize")
</code>
db.get har jag inte träffat på tidigare, vad är det?Sv: Problem med att convertera array till asp.net(C#)
Han demonstrerar bara principen, applicerbart till vilken miljö som helstSv: Problem med att convertera array till asp.net(C#)
const string cs = "Provider=Microsoft.Jet.OLEDB.4.0;"+
"Data Source=\"H:\\Documents and Settings\\Andreas\\My Documents\\Visual Studio 2005\\Projects\\ConsoleApplication1\\ConsoleApplication1\\db.mdb\"";
OleDbConnection con = new OleDbConnection(cs);
using (con)
{
con.Open();
DataTable dt = getRandomRows(con);
//List column names
foreach (DataColumn column in dt.Columns)
{
System.Diagnostics.Debug.Write(column.ColumnName);
}
System.Diagnostics.Debug.WriteLine("");
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
System.Diagnostics.Debug.Write(row[column]);
}
System.Diagnostics.Debug.WriteLine("");
}
}
//Retrives rows from database
DataTable getAllRows(OleDbConnection con)
{
const string sql = "SELECT * FROM Quize";
OleDbDataAdapter da = new OleDbDataAdapter(sql, con);
DataTable dt = new DataTable();
da.Fill(dt);
return dt;
}
DataTable getRandomRows(OleDbConnection con)
{
const int max = 10;
Random rnd = new Random();
DataTable dt = getAllRows(con);
DataTable result = new DataTable();
foreach (DataColumn column in dt.Columns)
{
result.Columns.Add(column.ColumnName, column.DataType );
}
if (dt.Rows.Count > max)
{
for (int i = 0; i < max; i++)
{
int index = rnd.Next(dt.Rows.Count);
DataRow row = dt.Rows[index];
result.Rows.Add(row.ItemArray);
row.Delete();
}
return result;
}
else
{
return dt;
}
}