collections
Børre Stenseth
C#>Collections

Collections

Hva
Kort om de vanligste collectionklassene

C# har et godt utbygd apparat for å håndtere datastrukturer av de vanlige typene, som lister, køer, stacker osv. I denne modulen demonstreres noe av klassene og noen ganske enkle brukssituasjoner.

Det er laget en klasse person som brukes som eksempelobjekt i avsnittene nedenfor.

_person

Eksemplene nedenfor er hver pakket inn i en klasse. Dette bare for at det skal være lett å kjøre demonstrasjoner i en applikasjon. Du bør sjekke ut demoprogrammet som angitt nederst på siden og eksperimentere med det.

List

_list
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CollectList
{
    class LISTS
    {
        List<person> Stab;
        public LISTS()
        {
            Stab = new List<person>();
            Stab.Add(new person("Ole", "Brum","Hakkebakkeskogen",123));
            Stab.Add(new person("Lionel", "Messi","Argentina",345));
            Stab.Add(new person("Peder", "Ås","Norge",201));
            Stab.Add(new person("Ari", "Behn","Norge",301));
            Stab.AddRange(new person[] { new person("Miles", "Davies","USA",1020), 
                                         new person("Dexter","Gordon","USA",1030) });
       }
        public void doit()
        {
  
            //---- do all--
            foreach (person p in Stab)
            {
                Console.WriteLine(p);
            }
            //----- pick one -----           
            person someone = Stab[3];
            Console.WriteLine(Stab.IndexOf(someone));
            
            //------- select first with predicate ------
            int ix=Stab.FindIndex(new FinnLand("Norge").FinnlandPredicate);
            if(ix!=-1)
                Console.WriteLine(Stab[ix]);
            else
                Console.WriteLine("fant ingen");
            //-------- select all with predicate ------
            List<person> Nordmenn = Stab.FindAll(new FinnLand("Norge").FinnlandPredicate);
            
            foreach (person p in Nordmenn)
            {
                Console.WriteLine(p);
            }
            //------- select all with lambda -----
            List<person> Amerikanere = Stab.FindAll(p => p.Land =="USA");
            foreach (person p in Amerikanere)
            {
                Console.WriteLine(p);
            }
            
            Console.ReadLine();
        }

        // handling predicate
        public class FinnLand
        {
            private String land;
            public FinnLand(String land)
            {
                this.land = land;
            }
            public bool FinnlandPredicate(person p)
            {
                if (p == null) throw new ArgumentNullException("person");
                return p.Land == land;
            }
        }
    }
}

SortedList

_sortedlist
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CollectList
{
    class SORTEDLISTS
    {
        SortedList<string,person> team;
        public SORTEDLISTS()
        {
            team = new SortedList<string, person>();
        }
        public void doit()
        {
            person[] personer ={new person("jens","mo","N",1),
                              new person("anders","øygarden","N",5),
                              new person("svein","jensen","D",19),
                              new person("bjørn","anderson","S",12)};
            
            foreach (person p in personer)
            {
                try {
                    // key must be unique
                    team.Add(p.Land, p); 
                }
                catch (Exception ex) { 
                    Console.WriteLine(ex.Message); 
                }
            }
            
            foreach (String id in team.Keys)
            {
                Console.WriteLine(id);
            }
            Console.ReadLine();
        }
    }
}

Queue

_queue
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CollectList
{
   
    class QUEUS
    {
        Queue<person> waiting;
        public QUEUS()
        {
            waiting = new Queue<person>();
        }
        public void doit()
        {
            waiting.Enqueue(new person("Jens","Pedersen","Danmark",3451));
            waiting.Enqueue(new person("Kari", "Olsen", "Norge", 3751));
            Console.WriteLine(waiting.Peek());
            foreach(person w in waiting)
                Console.WriteLine(w);
            person p=waiting.Dequeue();
            Console.WriteLine("removed: " + p);
            Console.WriteLine(waiting.Peek());
            person q=new person("Juan","Monteriro","Spania",3041);
            //waiting.Enqueue(q);
            if(waiting.Contains(q))
                Console.WriteLine(q+" er i køen");
            else
                Console.WriteLine(q + " er ikke i køen");

            Console.ReadLine();
        }
    }
}

Stack

_stack
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CollectList
{
    class STACKS
    {
        Stack<person> stabelen;
        public STACKS()
        {
            stabelen = new Stack<person>();
        }
        public void doit()
        {
            stabelen.Push(new person("Sverker","Jönson","Sverige",12));
            person p=new person("Oleg","Putin","Russland",37);
            stabelen.Push(p);
            while(stabelen.Count >0)
            {
                person q=stabelen.Pop();
                Console.WriteLine(q);
            }
             Console.ReadLine();
        }
    }
}

HashSet

_hashset
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CollectList
{
    class SETS
    {
        HashSet<person> allPersons;
        HashSet<person> team;
        HashSet<person> otherPersons;
        public SETS()
        {
            allPersons = new HashSet<person>();
            team = new HashSet<person>();
            otherPersons = new HashSet<person>();
        }
        public void doit()
        {
            person[] personer ={new person("jens","mo","N",1),
                              new person("anders","øygarden","N",5),
                              new person("svein","jensen","D",19),
                              new person("bjørn","anderson","S",12),
                               new person("pekka","karjalainen","F",12)};            
            
            foreach(person p in personer)
                allPersons.Add(p);
            // select team
            team.Add(personer[0]);
            team.Add(personer[1]);

            // select not in team
            otherPersons.UnionWith(allPersons);
            otherPersons.ExceptWith(team);
            foreach(person p in team)
                Console.WriteLine("Team member: "+p);
            foreach (person p in otherPersons)
                Console.WriteLine("Not in team: " + p);
            foreach (person p in allPersons)
                Console.WriteLine("Blandt alle: " + p);
            
            Console.ReadLine();
        }
    }
}
Referanser
Du kan eksperimentere med dette i programmet:
https://svn.hiof.no/svn/psource/Csharpspikes/collectList
Vedlikehold

B.Stenseth, februar 2012

(Velkommen) C#>Collections (Delegates)