Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Slumpa i en listview

Postades av 2008-12-07 22:12:35 - Tyronne Engström, i forum c# (c-sharp), Tråden har 27 Kommentarer och lästs av 1372 personer

Hej!

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?

//Tyronne


Svara

Sv: Slumpa i en listview

Postades av 2008-12-07 23:33:22 - Johan Djupmarker

Hur populerar du listan, varifrån kommer listan med filer?

/Johan


Svara

Sv: Slumpa i en listview

Postades av 2008-12-09 11:04:10 - Jonas Sjöblom

Du måste nog slumpa dom innan du läser in dom i listviewn.

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()


Svara

Sv:Slumpa i en listview

Postades av 2008-12-09 12:47:17 - Per Hultqvist

Eller så kan du göra så här :

* 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.


Svara

Sv: Slumpa i en listview

Postades av 2008-12-11 21:28:25 - Tyronne Engström

Jag läser in dem så här

<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?

/Tyronne


Svara

Sv:Slumpa i en listview

Postades av 2008-12-11 23:24:57 - Oskar Johansson

Det som per föreslog fungerar ju, är ju raden:
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?


Svara

Använd kraften av Linq- Sv: Slumpa i en listview

Postades av 2008-12-12 11:30:50 - Jon Wiberg

"Use the force Luke,... use the force" ;)

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.aspx


Svara

Mer Linq, varianter -Slumpa i en listview

Postades av 2008-12-12 11:37:53 - Jon Wiberg

och på http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/

"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 :)


Svara

Sv:Slumpa i en listview

Postades av 2008-12-13 00:41:37 - Tyronne Engström

Jag tror jag förstår hur Per menade...


Tack!

/Tyronne


Svara

Sv: Slumpa i en listview

Postades av 2008-12-14 22:22:14 - Tyronne Engström

Trodde jag ja!

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

/Tyronne


Svara

Sv:Slumpa i en listview

Postades av 2008-12-15 10:21:31 - Per Hultqvist

Tyronne,

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.../P


Svara

Dög inte Linq? - Sv:Slumpa i en listview

Postades av 2008-12-16 09:17:58 - Jon Wiberg

Vill du inte/kan du inte använda Linq som föreslagits i annat svar på tråd från mig?
I en av länkarna finns även med hur skapa annan typ av slumpmässigt urval.

?


Svara

Sv: Dög inte Linq? - Slumpa i en listview

Postades av 2008-12-16 12:54:02 - Tyronne Engström

Hej!

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?

/Tyronne


Svara

Sv: Slumpa i en listview

Postades av 2008-12-16 12:57:07 - Tyronne Engström

Hej!

Nu är jag med helt och hållet.

tack Per!

/Tyronne


Svara

Linq är mer än databas Sv:Dög inte Linq? - Slumpa i en listview

Postades av 2008-12-16 14:05:20 - Jon Wiberg

Ja och nej ;)

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. "


Svara

Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-16 14:30:43 - Jon Wiberg

Inget talar till en så bra som kod ;)

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! :)


Svara

Sv: Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-16 16:03:02 - Tyronne Engström

Hej Jon!

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"

/Tyronne


Svara

Sv:Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-16 16:19:36 - Simon Dahlbacka

<b>var files är inte det java?</b>

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.


Svara

Sv: Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-16 22:37:26 - Tyronne Engström

Ok!

Jag kör endast på 2.0 just nu

/Tyronne


Svara

Sv: Slumpa i en listview

Postades av 2008-12-16 23:37:08 - Tyronne Engström

Hej Per!

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?

/Tyronne


Svara

Sv:Slumpa i en listview

Postades av 2008-12-17 16:41:15 - Per Hultqvist

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.

Så ändra Random.Next(1,n) till Random.Next(0,listview.count) el dyl.


Svara

Sv: Slumpa i en listview

Postades av 2008-12-17 18:28:31 - Tyronne Engström

OK!

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!

/Tyronne


Svara

Sv:Slumpa i en listview

Postades av 2008-12-17 19:11:24 - Jan Bulér

Så här bör du kunna göra.

<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).aspx


Svara

Sv: Slumpa i en listview

Postades av 2008-12-17 22:58:52 - Tyronne Engström

Tack för all hjälp!


Nu har jag löst det

/Tyronne


Svara

Språkliga finesser Sv:Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-18 10:06:36 - Jon Wiberg

a=> är ett så kallat lambda uttryck
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.



Svara

Linq för .net 2.0 :P Sv: Färdig lösning för dig med Linq: Slumpa i en listview

Postades av 2008-12-18 10:17:02 - Jon Wiberg

>Linq kräver dessutom att du har ställt in target framework till 3.5 i projektets egenskaper.

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."


Svara

Nyligen

  • 08:28 Butiksskyltar: Hur upplever utbude
  • 22:31 Slappna av
  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 801
27 960
271 761
587
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies