[C#] Refactoren lukt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 23:32
Eigenlijk lijkt het heel simpel, maar ik wil het weer op de moeilijke manier doen:
De code die goed werkt
C#:
1
2
3
4
5
6
7
8
9
10
11
12
 var timeSpan = TimeSpan.MaxValue;
var formattedTime = new List<string>();
if (timeSpan.TotalDays > 1)
    formattedTime.Add(timeSpan.Days + "d");
if (timeSpan.TotalHours > 1)
    formattedTime.Add(timeSpan.Hours + "h");
if (timeSpan.TotalMinutes > 1)
    formattedTime.Add(timeSpan.Minutes + "m");
if (timeSpan.TotalSeconds > 1)
    formattedTime.Add(timeSpan.Seconds + "s");

String result = String.Join(", ",formattedTime)


Mijn idee was om dit met een dictionary van een of andere class het op te lossen. Alleen heb ik geen flauw idee hoe ik dat aan kan pakken.
C#:
1
2
3
4
5
6
7
8
var timeSpan = TimeSpan.MaxValue;
var items = new Dictionary<?,Tuple<?,string>>();
items.add(timespan.TotalDays,new Tuple<timespan.Days,d>();

foreach(var item in items){
if (item.key > 1)
  //pak item uit en stop het in een list.
}

Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 23:32
Facepalm, even verder nadenken en dan kom ik op het volgende uit xD:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
            var timeSpan = DateTime.Now - pCall.Timestamp;

            var formattedTime = new List<string>(4);

            var test = new Dictionary<double, Tuple<int, String>>
                {
                    {timeSpan.TotalHours, new Tuple<int, string>(timeSpan.Hours, "h")},
                    {timeSpan.TotalMinutes, new Tuple<int, string>(timeSpan.Minutes, "m")},
                    {timeSpan.TotalSeconds, new Tuple<int, string>(timeSpan.Seconds, "s")}
                };

            formattedTime.AddRange(test.Where(item => item.Key > 1).Select(item => item.Value.Item1 + item.Value.Item2));


Waarschijnlijk een gevalletje van veel te moeilijk nadenken. |:(
Zal het topic laten staan, heel misschien dat iemand er iets aan heeft :)

Acties:
  • 0 Henk 'm!

  • Laurens-R
  • Registratie: December 2002
  • Laatst online: 29-12-2024
hoewel opgelost; toch even een opmerking.

Je past in dit voorbeeld je logica aan hoe je zaken ophaalt. Refactoren gaat over het herindelen/structureren van code zonder daarbij te veranderen hoe het functioneert.

Maar goed :) fijn dat het is opgelost.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Of je doet gewoon:
C#:
1
string result = timeSpan.ToString(@"d\d\,\ h\h\,\ m\m\,\ s\s");

of:
C#:
1
string result = timeSpan.ToString("%d'd, '%h'h, '%m'm, '%s's'");

Ik snap niet waarom hier loops, dictionaries, lists en andere gekke zaken bij moeten komen kijken. Hooguit een StringBuilder; en zelfs dan nog had ik gewoon gekozen voor een string.format.
C#:
1
string result = string.Format("{0}d, {1}h, {2}m, {3}s", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);


[edit]
Oh, wacht, ik zie nu wel dat je niet "0d, 1h, 0m, 3s" wil maar "1h, 3s". Dat detail was me nog even niet opgevallen :P Dan had ik 't eerder zo gedaan:
C#:
1
2
var v = new[] { timeSpan.Days + "d", timeSpan.Hours + "h", timeSpan.Minutes + "m", timeSpan.Seconds + "s" };
string result = string.Join(", ", v.Where(x => !x.StartsWith("0")));

of:
C#:
1
2
3
4
5
string result = string.Join(", ", (new[] { 
    timeSpan.Days + "d", 
    timeSpan.Hours + "h", 
    timeSpan.Minutes + "m", 
    timeSpan.Seconds + "s" }).Where(x => !x.StartsWith("0")));

[ Voor 112% gewijzigd door RobIII op 02-05-2013 15:12 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • P-Storm
  • Registratie: September 2006
  • Laatst online: 23:32
RobIII schreef op donderdag 02 mei 2013 @ 14:59:
Of je doet gewoon:
C#:
1
string result = timeSpan.ToString(@"d\d\,\ h\h\,\ m\m\,\ s\s");

of:
C#:
1
string result = timeSpan.ToString("%d'd, '%h'h, '%m'm, '%s's'");

Ik snap niet waarom hier loops, dictionaries, lists en andere gekke zaken bij moeten komen kijken. Hooguit een StringBuilder; en zelfs dan nog had ik gewoon gekozen voor een string.format.
C#:
1
string result = string.Format("{0}d, {1}h, {2}m, {3}s", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);


[edit]
Oh, wacht, ik zie nu wel dat je niet "0d, 1h, 0m, 3s" wil maar "1h, 3s". Dat detail was me nog even niet opgevallen :P Dan had ik 't eerder zo gedaan:
C#:
1
2
var v = new[] { timeSpan.Days + "d", timeSpan.Hours + "h", timeSpan.Minutes + "m", timeSpan.Seconds + "s" };
string result = string.Join(", ", v.Where(x => !x.StartsWith("0")));

of:
C#:
1
2
3
4
5
string result = string.Join(", ", (new[] { 
    timeSpan.Days + "d", 
    timeSpan.Hours + "h", 
    timeSpan.Minutes + "m", 
    timeSpan.Seconds + "s" }).Where(x => !x.StartsWith("0")));
Volgens mij bevat de code van je nog een bug, TotalMinutes zorgt ervoor dat bij meer dan 1 minuut die altijd weergegeven wordt, dus om jou voorbeeld erbij te pakken:
"0d, 1h, 0m, 3s" wil maar "1h, 0m, 3s".

Dit is makkelijk op te lossen volgens mij door de where te vervangen door SkipWhile(x => x.StartWith("0"));
Zelfs in de kleinste codes kunnen fouten sluipen. Bedankt allen _/-\o_
offtopic:
Ik moet echt een keer beginnen met unit testen...


C#:
1
2
3
4
5
string result = string.Join(", ", (new[] { 
    timeSpan.Days + "d", 
    timeSpan.Hours + "h", 
    timeSpan.Minutes + "m", 
    timeSpan.Seconds + "s" }).SkipWhile(x => x.StartsWith("0")));

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

In dat geval klopte de code die je in de TS hebt staan al niet, want die werkt zoals RobIII het beschrijft ;)

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 00:29
HMS schreef op donderdag 02 mei 2013 @ 15:36:
In dat geval klopte de code die je in de TS hebt staan al niet, want die werkt zoals RobIII het beschrijft ;)
Call me crazy, maar ik zie niet hoe de code van RobIII hetzelfde is als de code uit het eerste codeblock in de TS.

Acties:
  • 0 Henk 'm!

  • HMS
  • Registratie: Januari 2004
  • Laatst online: 21-08 23:06

HMS

Caelorum schreef op donderdag 02 mei 2013 @ 15:37:
[...]

Call me crazy, maar ik zie niet hoe de code van RobIII hetzelfde is als de code uit het eerste codeblock in de TS.
Je hebt gelijk, ik was even in de war door het gebruik van TotalMinutes in de if check, en dan daarna Minutes in de lijst gooien.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
HMS schreef op donderdag 02 mei 2013 @ 15:41:
[...]


Je hebt gelijk, ik was even in de war door het gebruik van TotalMinutes in de if check, en dan daarna Minutes in de lijst gooien.
Ja, daar ging ik ook de mist in; de ene keer Total... en de andere keer zonder Total... :P Anyways; het idee is eender en 't is inmiddels dus opgelost :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1