Hej! Du måste nog slumpa dom innan du läser in dom i listviewn. Eller så kan du göra så här : Jag läser in dem så här Det som per föreslog fungerar ju, är ju raden: "Use the force Luke,... use the force" ;) och på http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/ Trodde jag ja! Tyronne, Vill du inte/kan du inte använda Linq som föreslagits i annat svar på tråd från mig? Hej! Ja och nej ;) Inget talar till en så bra som kod ;) Hej Jon! <b>var files är inte det java?</b> Ok! Hej Per! Du får inte sätta in en post i listviewen på position 10 (t ex ) om det inte finns 10 element i listan. Alltså måste du slumpa mellan 1 och n där n är antalet poster i listviewen. Nu slumpar du mellan 1 och totala antalet låtar. OK! Så här bör du kunna göra. a=> är ett så kallat lambda uttryck >Linq kräver dessutom att du har ställt in target framework till 3.5 i projektets egenskaper.Slumpa i en listview
Jag fyller en listview med värden. Jag undrar hur jag kan slumpa ordningen. Just nu är det en massa mp3 låtar men de hamnar alltid i en viss ordning. Jag vill kunna slumpa ordningen på dessa.
Har någon något förslag?
//TyronneSv: Slumpa i en listview
Jag antar att du har någon typ av array med items som du läser in, eller kanske från databasen? Finns säkert någon funktion i de flesta databaser för att slumpa ordningen.
MySQL har till exmepel ORDER BY RAND()Sv:Slumpa i en listview
* Läs in låtarna en efter en
* Finns det 0 element i listan så lägger du bara till första låten
* Finns det n element i listan så slumpar du fram ett heltal r mellan 0 och n och sätter in låten på plats r i listan.
När du lagt till alla låtar så har du en slumpad lista.Sv: Slumpa i en listview
<code>
DirectoryInfo id = new DirectoryInfo(HMpath);
id.GetFiles();
foreach (FileInfo FIL in id.GetFiles())
{
ListViewItem item1 = new ListViewItem(FIL.Name);//Betalid
listView1.Items.Add(item1);
}
label1.Text = " Antal: " + listView1.Items.Count + " st";
Mhindex = listView1.Items.Count;
listView1.Focus();
listView1.Items[0].Selected = true;
</code>
Alltså direkt via katalogen.
Går det inte att slumpa listviewn när man fyllt listan?
/TyronneSv:Slumpa i en listview
listView1.Items.Add(item1);
som du byter ut ut då.
Om du vill slumpa i efterhand så kanske du kan modifiera en sort-funktion på något sätt?Använd kraften av Linq- Sv: Slumpa i en listview
Ett exempel med Linq 2 sql http://weblogs.asp.net/zeeshanhirani/archive/2008/07/23/returning-random-products-using-linq-to-sql.aspx
Eller enbart linq på http://onteorasoftware.net/post/Use-Linq-to-create-a-random-list-of-numbers.aspxMer Linq, varianter -Slumpa i en listview
"Shuffle - randomly shuffle a sequence
I find myself regularly re-implementing the Shuffle operator when I am testing my code. Shuffle operator accepts a sequence and returns the same sequence, randomly rearranged.
This example prints digits 0..9 in a random order:
Enumerable.Range(0, 10).Shuffle().WriteLinesToConsole();
"
Eller http://www.codinghorror.com/blog/archives/001008.html
"As it turns out, the easiest way to implement a shuffle is by sorting. It's not exactly faster, as the typical sort is O(n log n) compared to the O(n) of the Knuth Fisher-Yates shuffle algorithm. We'll just sort by a random number-- in this case, a GUID.
var cards = Enumerable.Range(0, 51);
var shuffledcards = cards.OrderBy(a => Guid.NewGuid());
So we can ultimately implement a secure, unbiased shuffle as a one-liner in a modern programming language. "
Varför inte testa med extension methods om du vill kunna slumpa ofta?
http://gregbeech.com/blogs/tech/archive/2008/09/03/shuffle-and-takerandom-extension-methods-for-ienumerable-lt-t-gt.aspx
// Lycka tilll :)Sv: Slumpa i en listview
Jo jag fattar hur han menar men min Hjärna är bortblåst.
Snälla PEr, ge mig en hint bara. För just nu står det helt still
/TyronneSv:Slumpa i en listview
I stället för att använda ListView.Items.Add() så använder du ListView.Items.Insert() i stället, och sätter in varje element på en slumpad plats. Första elementet går ju bara att sätta in på en plats, andra går att sätta in på två platser, tredje går att sätta in på tre platser, e t c, så du behöver slumpa fram ett tal mellan 1..n, där n = ListView.Items.Count.
Lycka till.../PDög inte Linq? - Sv:Slumpa i en listview
I en av länkarna finns även med hur skapa annan typ av slumpmässigt urval.
?Sv: Dög inte Linq? - Slumpa i en listview
Jag fattar det som att LInQ är en SQL variant, eller har jag fel. Jag läser in filerna från katalogen och inte från en databas. Har jag förstått det hela rätt om LInQ?
/TyronneLinq är mer än databas Sv:Dög inte Linq? - Slumpa i en listview
eg eg (förenklat) är Linq är ett sätt att ställa frågor mot data (detta kan göras mot data i rammineet, tex en samling/kollektion)
Det finns ngt som heter Linq to sql ,DÄR man kan ställa liknande frågor men det genereras SQL frn frågorna och man kan hämta upp data från databas och iterera/loopa igenom returdatat.
Det finns flera Linq-"providers"
* Linq to sql - Ställa frågor mot databas av typen sql server 2005+ (även mot express)
* Linq 2 object -> från data skapa nya objektinstanser;
även anonyma sådana(dvs det finns ingen färdig klassspec)
* Linq to xml - skapa frågor från ett xmldokument (lite som xpath mm)
* Linq to datasets mm mm
3:e partutvecklare kan skriva egna Providers så det finns tex Linq mot amazons webtjänster, Linq mot World of Warcraftdatatyper från dess armory, ev. en mot Active directory osv...
Ett problem är att man inte håller isär begreppen, utan slarvigt :( kallar Linq to sql för "linq"
Lite som att inte ha ett kvalificerat namespace och förvirring råder därför om vad Linq ÄR.
Syntaxen/sättet att skriva Linq påminner om SQL, fast det är KOD och inte text :)
Välja ut data sammanfoga(projicera),gruppera,filtrera mm.
var linqBooks = from b in amazonService.GetAllBooks() where b.ISBN = "9781933988160" or b.title.contains("linq") orderby t.Title:
där amazonService kan vara en webbtjänst, egen klass.... som returnerar en samling av objektinstanser och du i ram-minnet senare väljer ut en delmängd samt sorterar denna.
Dvs du kan använda det mot nästan vilken data som helst... iaf om det är en samling av något slag.
Ta en kik på http://www.asp.net/learn/linq-videos/#linq och titta vad VB-teamet producerat som introduktion till Linq.
(Jag har inte hittat ngn c# motsvarighet på filmerna)
"These videos are focused on the new LINQ language features included in Visual Studio 2008. LINQ stands for Language Integrated Query, and it enables you to write queries over things like objects, databases, and XML in a standard way using new language syntax. "Färdig lösning för dig med Linq: Slumpa i en listview
Nedan modifiering av din kod så den slumpas;
slumpningen sker mha Linq och sortering på ett framslumpat värde i form av en guid.
se http://www.codinghorror.com/blog/archives/001008.html För en mer detaljerad förklaring.
Jag slog på ett filter som du kan ta bort för enbart läsa in .mp3-filer.
DirectoryInfo id = new DirectoryInfo(txtFilePath.Text);
var files = id.GetFiles("*.mp3").OrderBy(a => Guid.NewGuid());
foreach (FileInfo FIL in files)
{
ListViewItem item1 = new ListViewItem(FIL.Name);
listView1.Items.Add(item1);
}
label1.Text = " Antal: " + listView1.Items.Count + " st";
listView1.Focus();
listView1.Items[0].Selected = true;
observera några delar:
* Du har ett redundant anrop på getfiles; en med id.GetFiles och en i foreach-deklarationen; jag har tagit bort denna och ersatt med "var files"
Om du vill förenkla något så kan du alltså stoppa in hela uttrycket i foreach-deklarationen
DirectoryInfo dInfo = new DirectoryInfo(txtFilePath.Text);
foreach (FileInfo FIL in dInfo.GetFiles("*.mp3").OrderBy(a => Guid.NewGuid()))
// Lycka till! :)
Sv: Färdig lösning för dig med Linq: Slumpa i en listview
testade ditt exempel...
var files är inte det java? Fick det intrycket när jag kollade i länken du skickade
jag fick felmeddelande på
a => det är > de inte gillar. Den säger " invalid expression term"
/TyronneSv:Färdig lösning för dig med Linq: Slumpa i en listview
Nä, det är en implicit typad variabel (eller vad det nu officiellt heter), kräver C# 3.0 vilket implicerar Visual Studio 2008.
Linq kräver dessutom att du har ställt in target framework till 3.5 i projektets egenskaper.Sv: Färdig lösning för dig med Linq: Slumpa i en listview
Jag kör endast på 2.0 just nu
/TyronneSv: Slumpa i en listview
Så här blev det med ditt förslag
<code>
DataSet ds = new DataSet();
DataTable table = new DataTable("Spellista");
DataColumn col = new DataColumn("Namn");
table.Columns.Add(col);
ds.Tables.Add(table);
DirectoryInfo id = new DirectoryInfo(MPath);
id.GetFiles();
foreach (FileInfo FIL in id.GetFiles())
{
DataRow dsRow = ds.Tables["Spellista"].NewRow();
dsRow["Namn"] = FIL.Name;
ds.Tables["Spellista"].Rows.Add(dsRow);
}
int n = ds.Tables[0].Rows.Count;
int newNumber = 0;
int oldNumber = 0;
Random random = new Random();
foreach (DataRow row in ds.Tables[0].Rows)
{
newNumber = random.Next(1, n);
int lisviewCount = listView6.Items.Count;
if (newNumber != oldNumber)
{
ListViewItem item1 = new ListViewItem(row["Namn"].ToString());//Betalid
listView6.Items.Insert(newNumber, item1);
oldNumber = newNumber;
}
}
label3.Text = " Antal: " + listView6.Items.Count + " st";
Mellanindex = listView6.Items.Count;
listView6.Focus();
listView6.Items[0].Selected = true;
</code>
För dock ett felmeddelande som lyder
"An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in DKT SoundCenter.exe
Additional information: InvalidArgument=Value på 29 är inte giltigt för index.
"
Det spelar ingen roll vilket tal som slupas fram.
Är det för att listviewn är tom det blir så här?
/TyronneSv:Slumpa i en listview
Så ändra Random.Next(1,n) till Random.Next(0,listview.count) el dyl.Sv: Slumpa i en listview
Så lösningen är igentligen att fylla listviewn innan jag gör en insert med slupat index. För att kunna sätta in på slumpad position.
Om jag sätter Random.Next(0,listview.count) med tom lista blir count = 0 eller hur.
Men! insert ersätter den befintlig rad eller lägger den bara till en ny och då har jag en dublett i listan.
har Googlat på insert metoden men hittar igentligen ingen bra förklaring, har förmodligen sökt fel!
/TyronneSv:Slumpa i en listview
<code>
private void FillListButton_Click(object sender, EventArgs e)
{
Random rnd = new Random();
int index;
listView1.Items.Clear();
for (int i = 0; i < 500; i++)
{
index = rnd.Next(0, listView1.Items.Count+1);
ListViewItem item = new ListViewItem(String.Format("Fil nr {0}", i));
listView1.Items.Insert(index,item);
Debug.WriteLine(String.Format("{0} inserted at index {1}.", item.ToString(), index));
}
}
</code>
Insert: http://msdn.microsoft.com/en-us/library/xf54248d(VS.80).aspxSpråkliga finesser Sv:Färdig lösning för dig med Linq: Slumpa i en listview
var är som nämnts tidigare i tråden ett sätt att slippa skriva datatyp... datatypen är ändå starkt typad av uttrycket på högersidan.
Tänk följande scenario
System.Data.SqlClient.SqlConnection myConn = new System.Data.SqlClient.SqlConnection();
blir istället
var myConn = new System.Data.SqlClient.SqlConnection();
och använder du en metod som skapar Connection:en åt dig som returnerar säg.. DbConnection så blir
följdaktligen myConn som om du skrivit just det framför vid variabeldeklarationen.Linq för .net 2.0 :P Sv: Färdig lösning för dig med Linq: Slumpa i en listview
Ja och nej ;=)
Se http://www.albahari.com/nutshell/linqbridge.aspx
"Can I use LINQBridge with C# 2.0 and Studio 2005?
You can—but the query operators will be awkward to use without lambda expressions, extension methods, query syntax, etc."