AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion verkürzen

Ein Thema von faux · begonnen am 1. Mär 2006 · letzter Beitrag vom 4. Mär 2006
Antwort Antwort
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#1

Funktion verkürzen

  Alt 1. Mär 2006, 20:05
So, hätte mal kurz ne Frage.

Wie kann ich denn die folgene Funktion etwas verkürzen?
Code:
public static bool BoolToInt(object input)
{
  if (input is int)
  {
    if ((int)input == 0)
      return false;
    else
      return true;
  }
  else if (input is string)
  {
    if (Convert.ToInt32(input) == 0)
      return false;
    else
      return
        true;
  }
  return
    false;
}
Ich lese einen Wert aus der Registry; dieser wird vom .NET Framework als object zurückgegeben.
Der Wert kann ein string oder ein int sein. Ich überprüfe jetzt mit dem Schlüsselwort is, ob der Wert ein int bzw ein string ist, und gebe wenn der Wert 0 bzw "0" ist, false zurück; ansonsten true.
Das ganze geht doch sicherlich auch kürzer, denke ich mal.

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: Funktion verkürzen

  Alt 1. Mär 2006, 20:08
Du könntest es imho zumindest so machen:
Code:
public static bool BoolToInt(object input)

  if (input is int)
  { 
    return ((int)input != 0)
  } 
  else if (input is string)
  { 
    return (Convert.ToInt32(input) != 0)
  } 
  return false;
}
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Funktion verkürzen

  Alt 1. Mär 2006, 20:10
OK, das ist auch wieder wahr.
Aber ich hätte eher die Zeile mit dem is gemeint. Die würde ich gerne etwas verallgemeinern, denn es könnte ja auch ein long oder ein byte übergeben werden.

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

Re: Funktion verkürzen

  Alt 1. Mär 2006, 20:15
wenn du dir sicher bist, dass ein int oder ein string zurueckgegeben wird, der eine Zahl enthaelt, so ginge eine etwas seltsame, unschoene, aber kurze Variante:
Code:
public static bool BoolToInt(object input)
{
  return Convert.ToInt32(input.ToString()) != 0;
}
greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Funktion verkürzen

  Alt 1. Mär 2006, 20:18
Gute Idee.

Werde das Ganze noch mit TryParse absichern.

Hab da was verwechselt. Die Funktion gibts ja garnicht..
Wie könnt eich das sonst absichern?!


Hab doch nichts verwechselt, nur in der falschen Klasse nachgesehen.
Nicht Convert.TryParse, sondern Int32.TryParse..

Danke.

Code:
int val;
return (Int32.TryParse(input.ToString(), val) && val != 0);
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Funktion verkürzen

  Alt 1. Mär 2006, 21:35
Auweia... ;?

Suche mal nach Boxing/Unboxing oder einfach ".Net ist langsam". Diese Aussage kommt oft in Zusammenhang mit dem CLR Feature Boxing. Dieses Parsing eines strings in einen int, der mal ein int war und doch zu einem String gewandelt wurde....

Generics sind hier ein Weg, damit du jeden Value type ohne Umwandlung gegen sein default[1] vergleichen kannst.
Einen int aus Faulheit in ein object zu boxen ist nur unter .Net 1.1 zu verzeihen.

[1]alle numerischen Value types haben 0 als default, bool hat false als default

Hier mal ein Bleistift wie man a) alle Value types gegen 0/default in einen bool wandeln kann.
Außerdem enthält es noch eine Methoe, die lle mit String vergleichbaren typen gegen 1, True oder true vergleicht.

Einfach als abstraktes Beispiel auffassen, das zeigen soll, wie man type contraint von generics dazu benutzen kann, um mit den generischen Werten überhaupt etwas anfangen zu können.
Code:
class Program
{
   static bool PrimitiveToBool<T>(T value)
      where T : struct, IEquatable<T>
   {
      return !default(T).Equals(value);
   }

   static bool StringToBool<T>(T value)
      where T : IEquatable<String>
   {
      return !object.Equals(value, default(T)) &&
             (value.Equals("1") ||
              value.Equals("True") ||
              value.Equals("true"));
   }


   public static void Main(string[] args)
   {
      TestPrimitive<Int32>(0);
      TestPrimitive<Int32>(1);
      TestPrimitive<Int64>(0);
      TestPrimitive<Int64>(1);
      TestPrimitive<Decimal>(0);
      TestPrimitive<Decimal>(1);
      TestPrimitive<Single>(0);
      TestPrimitive<Single>(1);

      TestString<String>("true");
      TestString<String>("mööp");

      TestString<StringCompatible>("1");
      TestString<StringCompatible>(new StringCompatible("hallo"));
   }

   const string format = "{0}: {1} is {2}";

   private static void TestPrimitive<T>(T value)
      where T : struct, IEquatable<T>
   {
      Console.WriteLine(format, typeof(T), value, PrimitiveToBool<T>(value));
   }

   private static void TestString<T>(T value)
      where T : IEquatable<String>
   {
      Console.WriteLine(format, typeof(T), value, StringToBool<T>(value));
   }
}

struct StringCompatible : IEquatable<String>
{
   String value;

   public bool Equals(String other)
   {
      return String.Equals(value, other);
   }

   public StringCompatible(String value)
   {
      this.value = value;
   }

   public override String ToString()
   {
      return value;
   }

   public static implicit operator StringCompatible(String value)
   {
      return new StringCompatible(value);
   }
}
edit:
Output
System.Int32: 0 is False
System.Int32: 1 is True
System.Int64: 0 is False
System.Int64: 1 is True
System.Decimal: 0 is False
System.Decimal: 1 is True
System.Single: 0 is False
System.Single: 1 is True
System.String: true is True
System.String: mööp is False
Samples.GenericToBool.StringCompatible: 1 is True
Samples.GenericToBool.StringCompatible: hallo is False
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Funktion verkürzen

  Alt 1. Mär 2006, 22:27
@elvis:
Danke, aber das Stichwort "boxing" alleine hätte auch gereicht...

btw:
Bei deinem Beispiel muss man ja erst wieder den Typ kennen, würde ich mal sagen, oder sehe ich das falsch?
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: Funktion verkürzen

  Alt 1. Mär 2006, 22:50
Nuja
Code:
TestPrimitive<typeof(myVar)>(myVar);
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Funktion verkürzen

  Alt 1. Mär 2006, 23:11
Zitat von Dax:
Nuja
Code:
TestPrimitive<typeof(myVar)>(myVar);
Won't do
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#10

Re: Funktion verkürzen

  Alt 4. Mär 2006, 14:46
Wir wärs dann mit
Code:
MethodInfo method = typeof(Program).GetMethod("TestPrimitive");
MethodInfo tester = method.MakeGenericMethod(myVar.GetType());
tester.Invoke(null, new object[] {myVar});
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz