Entsprechende generic constraints sind aber aktuell im Gespräch um das in kommenden C# Versionen zu unterstützen. Aktuell geht das leider nicht nicht.
Hallo thexbasic,
Ich habe mich vor einiger Zeit lange damit beschäftigt und eine Bibliothek geschrieben, die mit dem Minecraft Protokoll umgeht. Das ganze ist aber leider aktuell veraltet(der letzte Commit ist knapp 1.5 Jahre alt), aber vielleicht hilft es dir weiter.
Sich darauf zu verlassen, dass Packete am Stück ankommen ist generell keine gute Idee, Ich habe damals eine Abstraktionsschicht über den Netzwerkstream geschrieben, welcher mir sicherstellt, dass immer so viel gelesen wird, wie ich erwarte.
Das findest du hier.
Lieben Gruß,
pdelvo
Fun fact: Auf .net strings folgt im Speicher trotzdem immer eine 0, sie sind also doch 0 terminiert. Das erleichtert interop mit nativen code.
Aber da braucht man sich nicht selbst drum zu kümmern.
Hallo Joosy,
Das einzige was mir jetzt einfallen würde ist, dass du ausversehen "Scope to this" (oder das deutsche equivalent) ausgewählt hast. Du kannst im Projektmappenexplorer auf das Haus Symbol klicken um zur Ursprungsansicht zu kommen.
LG pdelvo
Hallo,
Hast du schonmal ein anderes System ausprobiert? Liegt es vielleicht daran? Ansonsten versuch mal mit git bisect (oder manuell mit binärer Suche) die Änderung rauszufinden, die den Fehler eingeführt hat.
LG pdelvo
Hallo gpc44,
Ich glaube eher nicht, dass Regex hier das Performanceproblem ist. Allerdings geht es eleganter (und vielleicht auch etwas schneller) mit
if(!string.IsNullOrEmpty(line) && char.IsNumber(line[0]) { ... }
Wenn aber wirklich ein Performanceproblem vieliegt ist es sicher nicht das gewesen.
LG pdelvo
Zwei Rechtecke sind kollidiert, genau dann wenn einer der Eckpunkte von Rechteck 1 in Rechteck 2 liegt oder einer der Eckpunkte von Rechteck 2 in Rechteck 1 liegt.
ich könnte mir vorstellen, dass man die .NET Compiler Platform Roslyn nutzen könnte, um selbst einen Quellcode-Obfuscator zu erstellen.
Mit Roslyn könnte man sowas sehr leicht umsetzen. Identifier umbenennen, whitespaces entfernen, unnötige Klammern hinzufügen, konstante Ausdrücke verkomplizieren, vielleicht noch schön hässliche gotos einfügen sollten sehr einfach sein
Ich habe gerade ODA - The Online Disassembler gefunden der wohl einzelne Anweisungen ohne Dateiheader dekompilieren können soll. Die Frage ist dann ob man mit dem Assember weiterkommt
Ja ich bin mir da sicher. Ich hab vor Jahren mal kurz damit rumgespielt. Man kann so nativen Machinencode ausführen. Bei Aufruf des delegates wird einfach an den Anfang des Speicherbereiches gesprungen und ausgeführt. Ist es vielleicht 64bit Code?
Das ist kein IL, sondern Machinencode der da drin steht. Da musst du einen x86 Disassembler bemühen.
LG pdelvo
Man kann 16 auch als Summe aus einen Summanden "darstellen" und hätte damit auch in diesem Fall eine Lösung.
Hallo,
Wie wäre es denn wenn du die Daten zum lesen öffnest und dadurch das Löschen verhinderst?
LG,
pdelvo
BlockingCollection wäre super, wenn nicht die Anforderung wäre Operationen die sich in der Auflistung befinden zwichenzeitlich abzubrechen, was diese leider nicht unterstützt (meines Wissens nach)
Hallo jacques,
Auch eine List ist nicht besonders gut dafür geeignet Elemente aus der mitte zu entfernen. Die List Klasse ist intern als Array implementiert, so das wenn man ein Element löscht jeweils der komplette rest umkopiert werden muss.
Ein Kandidat der das Effizienter kann ist die Linked List. Diese ist besonders effizient beim Einfügen/Löschen an beliebigen Positionen.
Nachteil: Die Linked list ist nichtthread safe. hier muss man also mit locks
An threadsicheren Auflistungen gibt es die Klassen in System.Collections.Concurrent, aber leider keine Linked List.
Lieben Gruß,
pdelvo
Hallo sth_Weird,
Du kannst das als Generic machen
RegisterDataTemplate<T>(DataTemplate template) where T : IMyInterface
{
Type type = typeof(T);
}
Lieben Gruß,
pdelvo
Hallo krambambuli,
Warum die Fehlermeldung auftritt dürfte klar sein. Das Xml Dokument ist nicht Standardkonform, da ein Xml Dokument immer nur ein Root Element haben darf. Da das Dokument ja, wie du geschrieben hast groß ist würde ich vielleicht versuchen einen eigenen TextReader zu schreiben, der das Xml Dokument beim einlesen repariert und ein Dummy Root Element einfügt, und ansonsten die Daten einfach durchreicht.
Du hast ja irgendwie sowas
<?xml version="1.0" encoding="utf-8" ?>
<foo1>
...
</foo>
<foo2>
...
</foo2>
...
Dann kannst du das so reparieren:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<foo1>
...
</foo>
<foo2>
...
</foo2>
...
</root>
Lieben Gruß,
pdelvo
Hallo aken0,
Viel elleganter als
if(value < 19) return Untergewicht;
else if(value < 25) return normales Gewicht;
else if(value < 29) return leichtes Übergewiccht;
else return Übergewicht;
wirst du das nicht hinbekommen. Ich sehe da aber auch kein Problem drin.
Lieben Gruß,
pdelvo
Hallo UltraEdit,
Bring beide arrays in eine zufällige Reihenfolge (in O(n) möglich). dann kannst du 1 zu 1 zuordnen. kannst das also in O(n) machen.
Ist es das was du meinst?
LG pdelvo
Du musst die MailMessage danach auch disposen, damit die Datei freigegeben wird.
LG pdelvo
Was du bei der Methode der kleinsten Quadrate versuchst, ist die Summe der quadrierten Abstände deiner Schätzfunktion von den realen Werten zu minimierten. Also du musst k so wählen, das \sum_{i=0}^{n-1} (y_i - f_k(x_i))^2 möglichst klein wird. Das kannst du wahrscheinlich relativ gut Approximieren. Ansonsten ist vllt ddieser Algorithmus etwas für dich: Levenberg-Marquardt-Algorithmus
Ich persönlich finde es einfacher immer wieder durch 2 zu teilen anstatt durch 16. Klar hast du dann mehr Schritte, aber ich zumindest komme damit besser klar. Und wenn du die Zahl per Hand soweit runtergebrochen hast so das sie in den Taschenrechner passt kannst du ja damit weitermachen. Ist ja eigentlich schon nett dass ihr überhaupt einen benutzen dürft 😉
Da wirst du Wohl auf "traditionelle"Möglichkeiten Zurückgreifen müssen. mit Stift und papier ist das doch auch nicht sonderlich aufwendig.
LG pdelvo
Viele Dienste mögen es nicht, wenn kein User Agent mitgeschickt wird. Vielleicht liegts daran?
LG
Ich würde so daran gehen:
Was du ja haben willst, ist das du alles zwichen [] finden willst. Also brauchst du auf jedenfall etwas der Form [xxx]. Jetzt willst du den Inhalt in den Klammern schlussendlich lesen, also packst du da eine entsprechende Gruppe dafür rein [(?<match>xxx)]. Jetzt wär es sinnvoll eine möglichst Präzise Beschreibung des Inhaltes zu bekommen. Welche Zeichen dürfen in der Klammer sein? Das sind alle, außer [ und ]. Also hast du für den INhalt die Beschreibung [[]], und das darf sich natürlich beliebig oft wiederholen, so fehlt noch ein * dahinter. dadurch erhällst du den Ausdruck [(?<match>[[]])]. Damit findest du jetzt schon eine Klammer. Jetzt musst du probieren, durch wiederholung alle Klammern zu finden. Zwichen den Klammern darf ja alles stehen, außer [ und ]. Also Matcht [(?<match>[^[]])][[]]* einen Klammerausdruck, und den Bereich bis zum nächsten. Und das ist genau was du willst. denn ab da kannst du den Asdruck wieder von vorne anwenden. Also fehlen nur noch einmal ein * dahinter und der Ausdruck sollte passen: ([(?<match>[[]])][^[]])*
Es sieht wirklich komplizierter aus als es ist, vorallem durch die vielen Klammern. Aber so gehe ich vor wenn ich einen solchen Ausdruck aufstelle.
LG pdelvo
Sind die Buildabhängigkeiten nicht richtig gesetzt?
LG pdelvo
Du könntest auch das Kopieren der Dateien, und das anzeigen des Fortschrittdialoges mit Restdaueranzeige komplett Windows überlasen mittels SHFileOperation. Das Windows API Code Pack hat das soweit ich weiss alles vorgefertigt drin.
LG
Und unterstützt die Collection parallelisiertesd einfügen?
Du könntest versuchen mittels des Parent Prozesses zu entscheiden. Wenn in der Aufrufskette cmd oder powershell auftaucht die Konsolenversion nutzen, und sonst auf Forms zurückweichen
@Abt Sollte nicht ein
@foreach(...)
{
<option value="@(item.Value)" selected="@(item.Selected)">@(item.Text)</option>
}
ausreichend sein? Oder gibt es da dann auch Probleme?
LG
Du könntest das vielleicht etwas netter mit dem neuen Roslyn Compiler machen und damit Code generieren
Wenn das irgendwo steht ist das eindeutig falsch.
LINQ returnt bei anonymen Rückgaben (wie zbSelect(x=> new { .. } )
) nämlichdynamic
.
Das stimmt nicht. Der Typ ist ja auch nicht dynamisch, sondern trotzdem statisch. Im Intellisense wird er mit a' Bezeichnet und zugreifen kann man mit var und bekommt funktionierendes IntelliSense.
var temp = new
{
Name = "Mustermann",
Vorname = "Max"
};
var result = from x in Enumerable.Range(1, 100)
select new
{
Temp = 1
};
var n = result.First();
Listen können nun mit dem Listensyntax erstellt werden, wenn die Add Methode eine Erweiterungsmethode ist
Die Möglichkeit, Listen mit der Listensyntax zu initialisieren, ist m.E. nicht neu. Ich denke, das geht schon jetzt. Und ich denke, dass es reicht, wenn eine passende Add-Methode vorhanden ist, egal ob direkt in der Klasse oder als Erweiterungsmethode.
Habe es gerade ausprobiert. Folgendes kompiliert nur mit dem neuen Roslyn Kompiler und gibt einen Compilerfehler mit dem alten:
public class MyClass : IEnumerable<string>
{
static void Main(string[] args)
{
var temp = new MyClass { "a", "b" };
}
public IEnumerator<string> GetEnumerator()
{
throw new NotImplementedException();
}
IEnumerator IEnumerable.GetEnumerator()
{
throw new NotImplementedException();
}
}
public static class Extension
{
public static void Add(this MyClass cls, string test) { }
}
Fehlermeldung:
Program.cs(14,37): error CS0117: 'MyClass' enthält keine Definition für
'Add'.
Program.cs(14,41): error CS0117: 'MyClass' enthält keine Definition für
'Add'.
Automatische initialisierung von Eigenschaften finde ich generell ziemlich gut, allerdings sieht die Syntax "falsch" aus. Ich finde ein = nach einer schließenden Klammer ziemlich seltsam.
An die Syntax für Primärkonstruktoren kann man sich gewöhnen, auch wenn man da ganz grausige Dinge tun kann:
public class Foo(public string bar){ }
ist äquivalent zu:
public clas Foo
{
public string bar;
public Foo(string bar)
{
this.bar = bar;
}
}
Usings für Statische Member find ich auch ziemlich grausig. Werde ich auf jedenfall nicht benutzen.
Und das out Feature ist eigentlich nur ein Spezialfall vom Eigentlichen Feature.
Zuweisungen können nun aus Ausdrücke verwendet werden.
Folgendes geht jetzt:
int i = int j = 5;
Foo(int x = 6);
//usw
try catch mit Conditions ist auf den ersten blick überflüssig, aber gar nicht so verkehrt. Denn die Conditions verfälschen nicht den Call Stack.
Binärschreibweise ist praktisch. Es wird auch noch über etwas anderes debatiert. Und zwar über das Gruppieren in diesen literalen:
0x0101_1010
So kann man Zusammengehörige Flags gruppieren. Man kann beliebig viele unterstriche benutzen.
Weitere Features:
Listen können nun mit dem Listensyntax erstellt werden, wenn die Add Methode eine Erweiterungsmethode ist:
MyClass x = new MyClass(){"a", "b", "c"}; // wenn es eine Erweitungsmethode für Add gibt
Dictionaries können übersichtlicher angelegt werden
var dic = new Dictionary<string, string>
{
["x1"] = "y",
["x2"] = "y",
["x3"] = "y"
};
Und das schrecklichste:
var dic = new Dictionary<string, string>
{
$x1 = "y",
$x2 = "y",
$x3 = "y"
};
Das ist auch völlig äquivalent zum verherigen.
Ganz schlimm:
var dic = new Dictionary<string,string>{...};
string result = dic.$x1;
//Ist äquivalent zu
string result = dic["x1"];
Weiss ich nicht. Habe mich noch nicht damit beschäftigt, aber ich fand dass es zum Thema passt und zumindest einen Blick wert ist.
LG
Interessanterweise gab es auf der Build eine Demo dazu. Man hat eine sehr alte VB6 Anwendung weitesgehend Automatisch nach winforms C# und von dort in eine Store App und in eine Webanwendung umwandeln können. Ich glaube das war in der Keynote gestern, bin mir aber nicht ganz sicher. Scheint mit einem Drittanbietertool gemacht worden sein was wohl bald? rauskommt.
Ist vielleicht einen Blick wert.
LG pdelvo
Auch sehr interessant finde ich den vorgestellten neuen JIT Compiler, welcher ja nicht nur schneller ist als der alte, sondern auch die Türe zur utilisierung aufwendiger CPU Befehle öffnet, z.B. zu SIMD. Die gezeigten Beispiele (die man sich im übrigen auch selbst runterladen und testen kann) sind wirklich beeindruckend.
LG pdelvo
Außerdem würde ich solche Dinge immer Einstellbar machen, so dass Nutzer den Port dann auch ändern können wenn es Konflikte gibt.
LG
Zusätzlich zu dem was MrSparkle gepostet hat:
Mach die Money Klasse immutable, d.h. sie kann nur beim erstellen gesetzt werden, danach aber nie wieder geändert werden.
public sealed class Money
{
public Money(decimal value)
{
_value = value;
}
public decimal _value {get; private set;}
}
Das sieht so aus als würde die Methode sehr oft aufgerufen werden für viele Elemente. Du kannst das parallelisieren und die Elemente parallel abarbeiten, wenn du performance Probleme hast. Trotzdem hab ich noch 2 Anmerkungen zu deinem Beispiel Code.
Diese ganzen If Abfragen lassen sich sehr schön kurz als ein boolscher Ausdruck schreiben. Etwa so:
private bool Filtered(string s)
{
return s.StartsWith("Closed session for ")
|| s.StartsWith("Opened session for ")
|| s.StartsWith("Starting replication with server ")
|| s.StartsWith("Finished replication with server ")
|| (s.StartsWith("Router: Transferred ") && s.Contains(" messages to "));
}
Das machts etwas lesbarer. Dann noch eine Sache. Ich würde mir überlegen die Methode umzubennenen. Mir z.B. ist nicht klar was sie tut. Ist sie true, wenn ein Element in der Auflistung sein soll, oder ist sie true wenn nicht, also filtert sie raus?
Guck dir mal IObserver und IObservable an.
LG pdelvo
So werden interfaces Explizit implementiert. Die Properties tauchen dann nur auf wenn auch das interface gecastet wird. Das ist z.B. auch wichtig bei IEnumerable. Es gibt die interfaces IEnumerator und IEnumerator<T>. Beide fordern ein Property Current. Bei dem generischen Typ ist es vom Typ T. Bei IEnumerable vom Typ object. Das beißt sich also. Also musst du eine Implementierung explizit angeben. Sieht dann also so aus:
public T Current {get{...}}
public object IEnumerator.Current {get{...}}
LG pdelvo
Einmal kurz googeln und dann hättest du doch schon rausgefunden woran es liegt, und wie man es löst: Multidimensional Arrays in a struct in C#
Ansonsten sollte auch so etwas in der Art funktionieren wenn ich mich nicht irre:
struct MP5{
public fixed int iFelder[5, 12];
}
Ich würde bei diesen Anforderungen manuell arbeiten. Mit der MemoryMappedFile-Klasse. Dann kann sich das Betriebssystem darum kümmern was im Ram und was auf der Platte liegt. Zum Anzeigen müsstest du dann eine kleinere Kopie für den Ram erzeugen. Das sollte aber halb so wild sein
Mit NAudio ist das ganz einfach. Habe das erst vor kurzen gebraucht:
NAudio.CoreAudioApi.MMDeviceEnumerator e = new NAudio.CoreAudioApi.MMDeviceEnumerator();
var endpoint = e.GetDefaultAudioEndpoint(NAudio.CoreAudioApi.DataFlow.Render, NAudio.CoreAudioApi.Role.Multimedia);
Dann kann mit endpoint.AudioMeterInformation.MasterPeakValue die aktuelle Lautstärke des gerade ausgegebenen Audios abgefragt werden.
Edit: Ansonsten hat der endpoint noch ein Haufen weiterer Properties und Funktionen mit denen man auch an die Rohdaten kommen müsste
LG
Das Problem liegt hier:
var runTask = new Task( async () => { var t = await SomelongRunningMethod();
System.Console.WriteLine("Lambda has finished.");
});
Du übergibst dem Task Konstruktor eine Action, also gibt der lambda Ausdruck ein void zurück. Also verhällt sich das ganze nach "Fire and Forget" und returned direkt an dem await un der Task ist damit beendet. Der Task weiss nicht das die Methode intern noch weiterläuft
Was willst du denn damit erreichen?
Ja, teilweise laden und damit arbeiten