15. april 2010 - 17:07Der er
24 kommentarer og 1 løsning
forslag til løsning
Ja ved ikke lige hvad jeg skulle kalde dette emne,
men leder efter en måde at gribe det an på når jeg skal lave en funktion der gør således og ved ikke hvordan det kan lade sig gøre da jeg er ny i det her.
Skal lave en funktion der modtager et integer og sætter det i en liste med andre numre som man kan søge i MEN , meningen er så at det sidst ankomme nummer så skal være "låst" og ignores i de næste 3 sekunder og derefter frigives så man kan arbejde med numemret igen og der så nok er kommet et nyt nummer imellemtiden som også er låst i 3 sekunder osv osv.
dvs nummer 3 kommer ind i listen, låses i 3 sekunder, nummer 11 kommer ind og låses i 3 sekunder de føste 3 sekunder er gået og nr 3 frigives i listen.. osv osv
er der nogle der har en ide om hvordan den her kan løses. jeg er helt blank for ideer
Jeg var naaet frem til naesten den samme loesning:
using System; using System.Linq; using System.Collections.Generic; using System.Threading;
namespace E { public class Entry<T> { public DateTime TimeStamp { get; set; } public T Value { get; set; } } public class DelayedContainer<T> { private List<Entry<T>> data = new List<Entry<T>>(); public void Add(T o) { data.Add(new Entry<T>{TimeStamp = DateTime.Now, Value = o}); } public List<T> GetList() { DateTime cut = DateTime.Now.AddSeconds(-3); return data.Where(e => e.TimeStamp < cut).Select(e => e.Value).ToList(); } } public class Program { public static void Main(string[] args) { DelayedContainer<int> lst = new DelayedContainer<int>(); for(int i = 1; i <= 10; i++) { lst.Add(i); Console.WriteLine("Adding " + i); foreach(int v in lst.GetList()) Console.Write(" " + v); Console.WriteLine(); Thread.Sleep(1000); } Thread.Sleep(3000); Console.WriteLine("Done"); foreach(int v in lst.GetList()) Console.Write(" " + v); Console.WriteLine(); Console.ReadKey(); } } }
okey arne der fik du vist gjort det klart at der skal meget til før man skal tale om hastighed tak, troede bare det var en sløv banan at bruge linq generelt , tak
ARNE.. tænkte på om man kan gøre så den ikke skriver dobbelt. hvis man gør lst.Add(i) i dit eksempel vil eksempelvis have to gange nummer 12 hvis jeg forstår det rigtigt, kan man gøre så den opdater timestamp hvis den eksistere i forvejen
Ja sådan kan man også sige det som Arne gjorde :), men nej... du behøver slet ikke bekymre dig om performance på Linq - det er ammestuesnak fra folk der ikke ved bedre. Det er klart der er et overhead ved de delegates/ expressions der bruges i Linq, men det bliver formodentligt interessant når du arbejder med 1.000.000.000 objekter og så har du noget andet at tænke på end performance alligevel :)
using System; using System.Linq; using System.Collections.Generic; using System.Threading;
namespace E { public class DelayedContainer<T> { private class Entry<U> { public DateTime TimeStamp { get; set; } public U Value { get; set; } public override bool Equals(object obj) { if(obj is Entry<U>) return Value.Equals(((Entry<U>)obj).Value); else return false; } public override int GetHashCode() { return Value.GetHashCode(); } } private HashSet<Entry<T>> data = new HashSet<Entry<T>>(); public void Add(T o) { Entry<T> ent = new Entry<T>{TimeStamp = DateTime.Now, Value = o}; if(!data.Add(ent)) data.Where(e => e.Equals(ent)).First().TimeStamp = ent.TimeStamp; } public IList<T> GetList() { DateTime cut = DateTime.Now.AddSeconds(-3); return data.Where(e => e.TimeStamp < cut).Select(e => e.Value).ToList(); } } public class Program { public static void Main(string[] args) { DelayedContainer<int> lst = new DelayedContainer<int>(); for(int i = 1; i <= 10; i++) { lst.Add((i-1)%5+1); Console.WriteLine("Adding " + ((i-1)%5+1)); foreach(int v in lst.GetList()) Console.Write(" " + v); Console.WriteLine(); Thread.Sleep(1000); } Thread.Sleep(3000); Console.WriteLine("Done"); foreach(int v in lst.GetList()) Console.Write(" " + v); Console.WriteLine(); Console.ReadKey(); } } }
ja jeg fatter ikke engang hvordan den bruges endnu, kæmper med at læse den igen og igen. forstår ikke hvor den opdatere det nummer der netop er kommet ind i listen og lader de andre være uændret
arhh tusind tak, det hjalp en smule på forståelsen. skal lige læse den et par gange mere kan godt se hvad du mener skal bare lige have det stykket sammen i hovedet nu
Naa - du troede ikke paa de alternative loesninger??
Synes godt om
Ny brugerNybegynder
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.