Avatar billede henrik_40 Juniormester
25. september 2014 - 15:11 Der er 7 kommentarer og
1 løsning

Fjern element fra Dictionary<string, List<string>>

Hejsa
jeg har lavet en liste af keys og values:

Dictionary<string, List<string>> itsMe


Inholdet kunne se sådan ud:

"Piger"
--------       
Sofie
Charlotte
Helle

"Drenge"
---------
Hans
Jørgen

Nu vil jeg - feks. fjerne "Helle" fra listen. Hvordan gør jeg det??
Avatar billede jjam Juniormester
25. september 2014 - 17:13 #1
Har du prøvet? 

itsMe.Remove("Helle");
Avatar billede henrik_40 Juniormester
25. september 2014 - 17:27 #2
ja det kan man ikke da det er en liste af nøgler og strenge. Jeg har lavet en workaround, men den er virkelig molboagtig. Hvis du brænder efter at se min løsning (?) vil jeg gerne vise den,, ellers vil jeg tillade mig at lukke.
Avatar billede jjam Juniormester
25. september 2014 - 17:35 #3
Jeg vil gerne se løsningen, der sker jo nok ikke noget ved at blive klogere. :-)
Avatar billede henrik_40 Juniormester
25. september 2014 - 18:13 #4
Det bliver en lang smøre. Hvis du er forvirret forstår jeg dig godt!


Det er ikke navne jeg arbejder med, men firmaer - nøgler og aktivitere tilhørende firmaerne:

Firma1 har aktivetsnumre:
200123
200122
199000

Firma 2 har aktivitetsnumre:
200124
200125
199026
200999
300000

1) Jeg definerer:
En liste af aktiviteter :
static List<string> listOfActivities = new List<string>();
De indeholder alle aktitetsnumrene uden hensyntagen til firmaerne. Det gør jeg for at holde styr på hvilke aktiviteter som bliver slettet løbende.

Mit smertesbarn bliver oprettet:
static Dictionary<string, List<string>> itsMe;
den indeholder 1 - nøgle (firma1, firma2 osv) og 2 - aktiviterne til nøglerne

En listofscanning som viser listerne af aktiviter og firmaer der er tilbage efter aktivitetsnumrene bliver slettet.
static  List<KeyValuePair<int, string>> listofScanning = new List<KeyValuePair<int, string>>();



Nedenstående function er første step:
Jeg fylder ItsMe op, efter øverst i denne kommentars struktur.
Samtidig fylder jeg listOfActivities op med samtlige aktiviteter. Det er denne liste som viser hvilke aktiviter jeg har tilbage, hver gang jeg sletter.

Til sidst tilføjer jeg Itsme til ListOfScanning (funktionen nederst i denne kommentar)

        protected void LinkButtonCreate_Click(object sender, EventArgs e)
        {
            bool ok = false; listOfActivities.Clear();
            var db = new Entities1();

            //Creating the Dictionary Type.
            Type d1 = typeof(Dictionary<,>);
            //Creating KeyValue Type for Dictionary.
            Type[] typeArgs = { typeof(string), typeof(List<string>) };
            //Passing the Type and create Dictionary Type.
            Type makeme = d1.MakeGenericType(typeArgs);
            //Creating Instance for Dictionary<K,T>.
            object o = Activator.CreateInstance(makeme);
            //Typecasting the Object to Dictionary Obj.
            itsMe =
                o as Dictionary<string, List<string>>;
            //Getting the Type of Casted object.
            Type dicType = itsMe.GetType();
            // This is used to check any generic arguments passed.
            Type[] dicTypes = dicType.GetGenericArguments();

                //Creating the list item and adding to dictionary.

            // Create keys of PartnerNames
                for (int i = 0; i < partnerToList.Count; i++)
                {
                    List<string> add = new List<string>();

                    itsMe.Add(partnerToList[i].PartnerName, add);

                    // Get activityid's
                    var result = db.ActivitiesFromPartner(
                        Convert.ToInt16(partnerToList[i].PartnerID)
                        , Convert.ToDateTime(TextBoxPartnerDateFrom.Text)
                        , Convert.ToDateTime(TextBoxPartnerDateTo.Text)).ToList();
                    for (int j = 0; j < result.Count(); j++)
                    {
                        add.Add(result[j].Aktivitet.ToString());
                        listOfActivities.Add(result[j].Aktivitet.ToString());
                    }
                }

                AdditsMeTolistofScanning();

                RepeaterCount.DataSource = listofScanning.OrderBy(f => f.Value);
                RepeaterCount.DataBind();
}



SLETTER - SLETTER
Når jeg sletter en aktivitet bliver aktiviteten i min listOfActivities også slettet:
  listOfActivities.Remove(activityid); // bliver fint fjernet fra listen :-)


Jeg begynder så heeelt forfra med at lave sql-forespørgslen forfra, men indsætter kun i Itsme, hvis aktiviten findes i min aktivitetsliste:


                var db = new Entities1();
                itsMe.Clear();
                // Create keys of PartnerNames
                for (int i = 0; i < partnerToList.Count; i++)
                {
                    List<string> add = new List<string>();

                    itsMe.Add(partnerToList[i].PartnerName, add);

                    // Get activityid's
                    var result = db.ActivitiesFromPartner(
                        Convert.ToInt16(partnerToList[i].PartnerID)
                        , Convert.ToDateTime(TextBoxPartnerDateFrom.Text)
                        , Convert.ToDateTime(TextBoxPartnerDateTo.Text)).ToList();
                    for (int j = 0; j < result.Count(); j++)
                    {
                        if (listOfActivities.Contains(result[j].Aktivitet.ToString()))
                        {
                            add.Add(result[j].Aktivitet.ToString());
                        }
                    }
                }





                AdditsMeTolistofScanning();

                RepeaterCount.DataSource = listofScanning.OrderBy(f => f.Value);
                RepeaterCount.DataBind();


                AdditsMeTolistofScanning();
            }
            else
                Page.Response.Write("<br />Aktivitet kunne ikke findes!");

                RepeaterCount.DataSource = listofScanning.OrderBy(o =>o.Value);
            RepeaterCount.DataBind();















public void AdditsMeTolistofScanning()
{
  listofScanning.Clear();
  for (int k = 0; k < itsMe.Count; k++)
  {
      string keynName = itsMe.Keys.ToList()[k];
      int countActivitiesforKey = itsMe[keynName].Count;
        listofScanning.Add(new KeyValuePair<int, string>(countActivitiesforKey, keynName));
    }
}
Avatar billede arne_v Ekspert
25. september 2014 - 18:55 #5
Den sidste kode er lidt svaer at gennemskue.

Men her nogle ideer til problemet skitseret i selve spoergsmaalet.


using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class Program
    {
        private static void Dump(Dictionary<string, List<string>> data)
        {
            foreach(KeyValuePair<string, List<string>> entry in data)
            {
                Console.WriteLine(entry.Key + ":");
                foreach(string name in entry.Value)
                {
                    Console.WriteLine("  " + name);
                }
            }
        }
        public static void Main(string[] args)
        {
            Dictionary<string, List<string>> data = new Dictionary<string, List<string>>();
            data.Add("Piger", new List<string> { "Sofie", "Charlotte", "Helle" });
            data.Add("Drenge", new List<string> { "Hans", "Jørgen" });
            Dump(data);
            data.Keys.ToList().ForEach(key => data[key].Remove("Helle"));
            Dump(data);
            Console.ReadKey();
        }
    }
}



using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class SpecialData<T1,T2>
    {
        private Dictionary<T1, List<T2>> data1 = new Dictionary<T1, List<T2>>();
        private Dictionary<T2, List<T1>> data2 = new Dictionary<T2, List<T1>>();
        public void Add(T1 key, List<T2> val)
        {
            data1.Add(key, val);
            foreach(T2 oneval in val)
            {
                if(!data2.ContainsKey(oneval))
                {
                    data2.Add(oneval, new List<T1>());
                }
                data2[oneval].Add(key);
            }
        }
        public void Remove1(T1 key)
        {
            foreach(T2 oneval in data1[key])
            {
                data2.Remove(oneval);
            }
            data1.Remove(key);
        }
        public void Remove2(T2 oneval)
        {
            foreach(T1 key in data2[oneval])
            {
                data1[key].Remove(oneval);
            }
            data2.Remove(oneval);
        }
        public void Dump()
        {
            foreach(KeyValuePair<T1, List<T2>> entry in data1)
            {
                Console.WriteLine("{0}:", entry.Key);
                foreach(T2 oneval in entry.Value)
                {
                    Console.WriteLine("  {0}", oneval);
                }
            }
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            SpecialData<string, string> data = new SpecialData<string, string>();
            data.Add("Piger", new List<string> { "Sofie", "Charlotte", "Helle" });
            data.Add("Drenge", new List<string> { "Hans", "Jørgen" });
            data.Dump();
            data.Remove2("Helle");
            data.Dump();
            Console.ReadKey();
        }
    }
}
Avatar billede henrik_40 Juniormester
14. november 2014 - 10:09 #6
Tak arne_v.
En del bedre kode end min egen ;)
Avatar billede MADOlsen Forsker
14. november 2014 - 10:50 #7
#6 Burde arne_v så ikke have fået pointene?
Avatar billede henrik_40 Juniormester
14. november 2014 - 10:52 #8
Som ofte. Ja. Men i dette tilfælde havde jeg jo selv fundet løsningen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester