Sorry, das var-Keyword und die Intersect-Extensionmethod gibt es erst seit .NET 3.0.
Hallo,
wie bereits erwähnt wurde, erstmal ein sauberes Objektmodell basteln und dann kannst Du z.B. die Intersect-Methode verwenden:
class Program
{
static void Main(string[] args)
{
var comp = new RangeComparer();
var list = new List<Range>();
list.Add(new Range(10, 20));
list.Add(new Range(21, 30));
var overlaps = list.Intersect(new Range[] { new Range(30,35) }, comp).Count() > 0;
var overlapsNot = list.Intersect(new Range[] { new Range(31, 35) }, comp).Count() > 0;
}
}
public class Range
{
public Range(int start, int end)
{
this.Start = start;
this.End = end;
}
public int Start { get; set; }
public int End { get; set; }
}
public class RangeComparer : IEqualityComparer<Range>
{
public bool Equals(Range x, Range y)
{
return x.Start <= y.End && x.End >= y.Start;
}
public int GetHashCode(Range obj)
{
return 0;
}
}
var joined = string.Join(", ", Enumerable.Range(0, 10));
Hallo,
also bei mir matchen beide Zeichenketten korrekt.
var s1 = "Table 9.2.1/3GPP TS 24.008: Messages for mobility management";
var s2 = "Table 9.4.9/TS 24.008: AUTHENTICATION AND CIPHERING REQUEST message content";
Regex r = new Regex(@"/(?:3GPP )?TS [0-9.]+[:punct:]?");
Console.WriteLine(r.Match(s1).Success);
Console.WriteLine(r.Match(s2).Success);
Evtl. machst Du ja sonst noch was anders, als im obigen Quelltext dargestellt.
Hallo,
da das Debug.Assert ja aus der PDFSharp DLL stammt, musst Du natürlich auch die Release-Version von PDFSharp nehmen. Deine Exe-Datei hat damit nichts zu tun.
Hallo,
in dem von Dir verlinkten Thread steht ja schon, dass es aus dem Debug.Assert kommt.
Wenn Du also eine Release-Version verwendest, dann hast Du das Problem nicht mehr.
Was genau meinst Du hier mit "in die Meta-Daten browse"?
Das wär ja zu schön gewesen 😉
Bei mir hilft das leider nicht...
Hmm, ich habe einen Testuser als Administrator angelegt und ein entsprechendes Passwort vergeben, welches ich dann im Code verwendet habe (wie bei Dir im Beispiel).
Danach hat das einwandfrei geklappt (bei mir war es allerdings VS 2010, falls das eine Rolle spielt).
Hallo,
also ich habe es jetzt mal mit deinem ersten Beispielcode versucht und wenn ich das
WorkingDirectory
nicht zuweise, dann klappt es.
Hallo,
das ist jetzt mal nur so dahin geraten, aber was passiert wenn Du den Prozess so startest?
Process.Start("runas", "/user:MeinUser \"C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\IDE\devenv.exe\"");
Aber warum? Liegt es daran, dass er IEnumberable erst beim ersten Zugriff auflöst?
weil du yield benutzt.
So wird er erst dann reinspringen, wenn das Enumerable das erste Item braucht.
Hallo,
was passiert wenn Du auf dem Object matches
ToArray()
aufrufst? 😃
Contains geht aber nur bei string und nicht bei Fremdschlüssel welche int sind.
Es gibt hier also kein p => p.Fk_Uhrzeit_id.Contains oder mache ich was falsch?
Hallo,
ich denke Diräkt meinte auch nicht die Contains-Methode vom Typ string, sondern die Contains-Methode einer Auflistung, (z. B. IEnumerable<int>).
Probier doch mal in deiner Query:
(new int[]{128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,100}).Contains(fk_uhrzeit_id)
Hallo Campy,
also wenn die Propertynamen von aussen kommen, dann ist meine dynamic
-Lösung nicht das was Du brauchst.
Dann würde ich eher zu Dynamic Linq tendieren (siehe z.B. http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)
Das ganze würde dann bei dir ungefähr so aussehen:
using System.Linq.Dynamic;
class Program
{
[STAThread]
static void Main(string[] args)
{
List<Person> list = new List<Person>();
list.Add(new Person() { Name = "Hans", Age = 20 });
list.Add(new Person() { Name = "Max", Age = 22 });
list.Add(new Person() { Name = "Hans", Age = 33 });
var filtered = list.AsQueryable().Where("Name = @0 AND Age > @1", "Hans", 30).ToList();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
Den String für die Where-Methode von Dynamic Linq musst Du dann nur noch selbst zusammenbauen (inkl. Operatoren).
Was mach ich mit dem ext?
Die Frage ist ja schon wesentlich genauer... 🤔
Hallo,
Ich möchte die Prüfung ob eine Interface valide ist generalisieren!
Eigentlich möchtest Du doch die Implementierung prüfen, denn ein Interface an sich ist ja immer "valide".
Wieso reicht also nicht ein Interface mit einer Methode bool IsValid()
, in der geprüft wird, ob alle implementierten Interfaces "valide" sind?
Ok, jetzt verstehe ich es. Dadurch geht natürlich ziemlich viel Typsicherheit flöten.
Das wäre ja eigentlich nur interessant, wenn Interfaces nicht in Frage kommen und die Properties von verschiedenen Klassen gleich lauten und diese gefiltert werden sollen.
Naja ok, Du könntest dann natürlich auch mit dynamic arbeiten, z. B.:
class Program
{
[STAThread]
static void Main(string[] args)
{
List<Person> list = new List<Person>();
list.Add(new Person() { Name = "Hans", Age = 20 });
list.Add(new Person() { Name = "Max", Age = 22 });
list.Add(new Person() { Name = "Hans", Age = 33 });
List<Func<dynamic, bool>> filters = new List<Func<dynamic, bool>>();
filters.Add(f => f.Name.Equals("Hans"));
filters.Add(f => f.Age > 30);
Func<dynamic, bool> composite = f => filters.TrueForAll(x => x(f));
var filtered = list.Where(composite).ToList();
}
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
}
Hallo Campy,
also ganz verstehe ich es nicht.
Es geht doch darum dass man eine Objektliste hat, z. B. List<Company> und darauf gefiltert werden soll. Dazu hätte ich dann den von mir geposteten Code hergenommen.
Und wieso müssen die Objekte eigentlich SearchableObject implementieren?
In deiner Find-Methode würde doch auch ein Object, statt SearchableObject reichen.
Oder reden wir irgendwie aneinander vorbei?
Hallo,
ich weiss nicht ob ich Dich richtig verstanden habe, aber reicht für dein Beispiel nicht einfach:
companies.Where( f => !f.Test && "Name2".Equals(f.Name2) );
Hallo Cat,
deine Variante ist problematisch, da Du den ObjectContext disposed und bei einer späteren Evaluierung (z.b. mit ToList) der Zugriff fehlschlägt (da db
dann bereits disposed ist).
Siehe auch: ObjectContext instance has been disposed problem while binding
Du hast natürlich Recht. Ich habe es jetzt mal auf Referenztypen beschränkt.
Ausserdem habe ich noch eine dynamische Variante hinzugefügt.
Extension-Method zur Regex-Klasse, um anhand der Gruppennamen passende Objekte zu erzeugen
Hier erstmal das Snippet. Ein Beispiel folgt weiter unten.
public static class RegexExtensions
{
public static IEnumerable<T> Matches<T>(this Regex regex, string input, ICustomConverter<T> converter = null) where T : class, new()
{
if (typeof(T) == typeof(object))
return MatchesDynamic<T>(regex, input, converter);
else
return MatchesDefault<T>(regex, input, converter);
}
private static IEnumerable<T> MatchesDefault<T>(this Regex regex, string input, ICustomConverter<T> converter = null) where T : class, new()
{
var bindingFlags = BindingFlags.IgnoreCase | BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance;
var t = typeof(T);
foreach (Match m in regex.Matches(input).OfType<Match>().Where(f => f.Success))
{
T itm = new T();
for (int i = 1; i < m.Groups.Count; ++i)
{
var groupName = regex.GroupNameFromNumber(i);
if (converter == null || !converter.Convert(groupName, m.Groups[i], itm))
{
var pi = t.GetProperty(groupName, bindingFlags);
if (pi != null)
pi.SetValue(itm, Convert.ChangeType(m.Groups[i].Value, pi.PropertyType), null);
}
}
yield return itm;
}
}
private static IEnumerable<T> MatchesDynamic<T>(this Regex regex, string input, ICustomConverter<T> converter = null) where T : class, new()
{
var groupNames = regex.GetGroupNames();
foreach (Match m in regex.Matches(input).OfType<Match>().Where(f => f.Success))
{
dynamic itm = new DynamicResult(m, groupNames);
for (int i = 1; i < m.Groups.Count; ++i)
{
var groupName = regex.GroupNameFromNumber(i);
if (converter != null)
converter.Convert(groupName, m.Groups[i], itm);
}
yield return itm;
}
}
public interface ICustomConverter<T>
{
// Liefert true, falls manuell konvertiert wurde, ansonsten false
bool Convert(string groupName, Group group, T item);
}
private sealed class DynamicResult : DynamicObject
{
private Dictionary<string, string> values;
public DynamicResult(Match match, string[] groupNames)
{
this.values = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
foreach (var grpName in groupNames)
this.values.Add(grpName, match.Groups[grpName].Value);
}
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string grpValue = null;
result = this.values.TryGetValue(binder.Name, out grpValue) ? grpValue : null;
return result != null;
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.values[binder.Name] = value.ToString();
return true;
}
}
}
Hat man beispielsweise Zeichenfolgen die die Grundlage für bestimmte Objekte darstellen, so kann man diese automatisch mappen lassen.
Das Beispiel zeigt ein Regex-Muster für Personendaten und die entsprechende Person-Klasse.
Die Namen der Regex-Gruppen müssen den Properties der Klasse entsprechen. Falls dies nicht möglich sein sollte oder man in das Mapping eingreifen möchte,
so kann ein ICustomConverter-Objekt übergeben werden.
Die Verwendung von "regexCustomConverter" zeigt dies beispielhaft.
Ausserdem gibt es noch eine dynamische Variante, indem man als generischen Parameter 'dynamic' übergibt.
static class Program
{
static void Main(string[] args)
{
var regex = new Regex(@"(?<vorname>\w+)\s+(?<nachname>\w+)\s+\((?<age>\d+)\)");
var regexCustomConverter = new Regex(@"(?<vorname>\w+)\s+(?<nachname>\w+)\s+\((?<age>\d+)\)\s+\((?<gender>[a-z])\)");
// "Normale" Verwendung
foreach (var p in regex.Matches<Person>("Max Mustermann (23)"))
{
Console.WriteLine(p.Vorname);
Console.WriteLine(p.Nachname);
Console.WriteLine(p.Age);
}
Console.WriteLine();
// Verwendung eines CustomConverters
foreach (var p in regexCustomConverter.Matches<Person>("Max Mustermann (23) (m)", new PersonConverter()))
{
Console.WriteLine(p.Vorname);
Console.WriteLine(p.Nachname);
Console.WriteLine(p.Age);
Console.WriteLine(p.Gender);
}
Console.WriteLine();
// Verwendung mittels dynamic
foreach (var p in regex.Matches<dynamic>("Max Dynamic (23)"))
{
Console.WriteLine(p.Vorname);
Console.WriteLine(p.Nachname);
Console.WriteLine(p.Age);
}
Console.WriteLine();
// Verwendung mittels dynamic (und Converter)
foreach (var p in regexCustomConverter.Matches<dynamic>("Max Dynamic (23) (f)", new DynamicConverter()))
{
Console.WriteLine(p.Vorname);
Console.WriteLine(p.Nachname);
Console.WriteLine(p.Age);
Console.WriteLine(p.Gender);
}
Console.ReadLine();
}
public class PersonConverter : RegexExtensions.ICustomConverter<Person>
{
public bool Convert(string groupName, Group group, Person item)
{
if (string.Equals("gender", groupName))
{
item.Gender = string.Equals(group.Value, "m") ? Gender.Male : Gender.Female;
return true;
}
return false;
}
}
public class DynamicConverter : RegexExtensions.ICustomConverter<object>
{
public bool Convert(string groupName, Group group, object item)
{
dynamic d = item;
if (string.Equals("gender", groupName))
{
d.Gender = string.Equals(group.Value, "m") ? Gender.Male : Gender.Female;
return true;
}
return false;
}
}
}
public class Person
{
public string Vorname { get; set; }
public string Nachname { get; set; }
public int Age { get; set; }
public Gender Gender { get; set; }
}
public enum Gender
{
Male,
Female
}
Viel Spass damit!
Schlagwörter: Regex, Mapper, Mapping
Hallo dN!3L,
das war mir schon klar (bis auf FieldInfo => Eigenschaften/Felder 😉).
Ich wollte eigentlich darauf hinaus, warum die Aussage von michlG "korrigiert" wurde.
Ein PropertyInfo wird ja nicht von einem Property geholt, sondern vom jeweiligen Typen.
Der Typ wird aus der Variable "object o" (Methodenparameter) geholt (o.GetType()).
Und wenn dann müsste es höchstens "FieldInfo=Field" heissen, denn für Nicht-Member-Variablen gibt es kein FieldInfo.
das heisst?
Hallo,
ja das geht. Schau dir hierzu auch mal in Regex die Groups an.
Kleines Beispiel (ungetestet):
MatchCollection mc = Regex.Matches(input, @"\[setid\:(?<x>\d+)=(?<y>\d+)\]");
foreach(var m in mc) {
m.Groups[0] // komplett
m.Groups["x"] // wert von x
m.Groups["y"] // wert von y
}
Ist es denn möglich den Rückgabewert wieder in ein IEnumerable<string> herein zu schreiben?
Dann mach doch gleich einfach:
fruits.Where(fruit => fruit.Length < 6).Take(1).ToList();
Also bei itextsharp habe ich nirgends eine Möglichkeit gefunden
Wirklich gesucht hast Du nicht oder? Wenn ich nach "itextsharp image" suche, liefert gleich der erste Treffer ein passendes Ergebnis. (iTextSharp - Working with images)
Da Du ja quasi eine Client-seitige Methode in dem Title-Property verwendest, müsstest Du ja eh erst alle Zeilen lesen, damit Du entscheiden kannst ob gefiltert werden muss. Du könntest Dir natürlich eine C# Methode erstellen, welche vom SQL Server verwendet werden kann (ein Beispiel ist hier: http://www.setfocus.com/technicalarticles/articles/clrfunctionforsqlserver.aspx).
Aber damit bindest Du Dich fest an den SQL Server. Außerdem weiss ich nicht, wie Du das dann in deiner ApplyFilter Methode verwenden kannst.
Ansonsten müsstest Du die NotMapped-Properties separat behandeln und später mit den anderen Ergebnissen mergen.
Die NotMapped-Properties kannst Du in deiner ApplyFilter wie folgt abfangen:
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> source, LambdaExpression columnExpression, String value)
{
var mi = (MemberInfo)((dynamic)columnExpression.Body).Member;
var notMappedAttribute = mi.GetCustomAttributes(typeof(NotMappedAttribute), true).FirstOrDefault();
if (notMappedAttribute != null)
return source;
...
}
Aha, jetzt kommen wir der Sache schon näher 😃
Wie wärs mit: Displaying Data in a Chart with ASP.NET Web Pages (Razor)
Das Konstrukt ergibt sowas in der Art:
model => (model => model.Property).Contains("something")
was natürlich nicht kompilierbar ist.
Hast Du das denn getestet oder ist das nur eine Vermutung?
Ich habe das ganze mal schnell runtergeschrieben und bei mir funktioniert das (natürlich erstmal ohne EF):
class Program
{
[STAThread]
static void Main(string[] args)
{
MethodInfo getDataMethod = typeof(GridModel).GetMethod("GetData");
object result = getDataMethod.Invoke(null, null);
Type dataSource = ((IQueryable)result).ElementType;
MethodInfo applyFilterMethod = typeof(Program).GetMethod("ApplyFilter");
applyFilterMethod = applyFilterMethod.MakeGenericMethod(new System.Type[] { ((IQueryable)result).ElementType });
Expression<Func<Series, string>> exp1 = f => f.Title;
result = applyFilterMethod.Invoke(null, new object[] { result, exp1, "test" });
}
public static IQueryable<T> ApplyFilter<T>(IQueryable<T> source, LambdaExpression columnExpression, String value)
{
MethodCallExpression methodCall = Expression.Call(columnExpression.Body, "Contains", null, Expression.Constant(value, typeof(String)));
var param = columnExpression.Parameters.First();
LambdaExpression lamda = Expression.Lambda(methodCall, param);
Expression<Func<T, Boolean>> expression = Expression.Lambda<Func<T, Boolean>>(methodCall, false, param);
return source.Where(expression);
}
}
public class Series
{
public string Title { get; set; }
public DateTime Updated { get; set; }
}
public class GridModel
{
public static IQueryable<Series> GetData()
{
List<Series> list = new List<Series>();
list.Add(new Series() { Title = "test", Updated = DateTime.Now });
return list.AsQueryable();
}
}
Hallo,
Du solltest deine Frage schon ausführlicher gestalten. Ich verstehe nicht so recht was Du genau willst.
Razor ist ja nur die ViewEngine. Für statistische Auswertungen brauchst Du sicherlich eine Datenbank. JavaScript hilft Dir da erstmal nicht weiter.
Hi,
ich denke Du musst einfach den Parameter aus der Expression wiederverwenden.
Ändere mal deine Methode ApplyFilter wie folgt ab:
public IQueryable<T> ApplyFilter<T>(IQueryable<T> source, LambdaExpression columnExpression, String value)
{
MethodInfo contains = typeof(String).GetMethod("Contains");
ParameterExpression param = columnExpression.Parameters.First();
MethodCallExpression methodCall = Expression.Call(columnExpression.Body, contains, Expression.Constant(value, typeof(String)));
Expression<Func<T, Boolean>> expression = Expression.Lambda<Func<T, Boolean>>(methodCall, false, param);
return source.Where(expression);
}
Und beim Aufruf übergibst Du dann einfach nur die Expression (nicht den Body):
result = ApplyFilterMethod.Invoke(this, new Object[] { result, loopColumn.Expression, Request.Form[loopColumn.ColumnName] });
Hoffe das klappt. Kann es hier leider schlecht testen.
Hi,
kannst Du vielleicht den zusammenhängenden Code posten?
Irgendwie fehlt doch da der Aufruf der ApplyFilter-Methode, oder?
Hallo,
es kommt natürlich schon auf den konkreten Anwendungsfall an. Grundsätzlich finde ich so einen statischen Ansatz (oder alternativ das Singleton-Pattern) eher unsauber.
Als Alternative kannst Du einen Dependency Injection Container (DI-Container) verwenden. Der Container übernimmt dann die Instanzierung der jeweiligen Klassen und versorgt die abhängigen Objekte mit dieser Instanz. Es ist allerdings eine andere Art der Entwicklung und für deinen Anwendungsfall evtl. zu komplex.
Aber generell lohnt es sich schon sich mit dem Einsatz von DI-Containern zu befassen.
Hi,
ich bin mir nicht sicher ob ich das Problem richtig verstanden habe, aber sollte das nicht ausreichen?
int[] ids = new int[] { 36 };
Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(34, "1");
dict.Add(35, "2");
dict.Add(36, "3");
var result = dict.Select(f => new KeyValuePair<int, int>(f.Key, ids.Count(x => f.Key == x)));
Wie sieht denn der momentane Code aus?
Edit: Oder versuch mal die MailMessage zu disposen (siehe auch http://stackoverflow.com/questions/1296380/smtp-send-is-locking-up-my-files-c)
Du rufst aber schon die Dispose-Methode vom SmtpClient-Objekt auf, oder?
Wie gesagt: Ich hab nix gefunden, wie man einen User für die DB anlegt. X(
Hmm, nach was hast du denn gesucht? ("create user sql server" gibt einiges zurück)
Über das Management Studio lässt sich komfortabel ein User erzeugen oder eben
manuell mit sql statements wie hier:
http://www.herongyang.com/JDBC/SQL-Server-PreparedStatement-Create-User.html
Wenn ich das richtig verstehe, willst du die Validierung der DataAnnotation manuell anstossen?!
Falls ja, dann ist diese Klasse etwas für dich:
System.ComponentModel.DataAnnotations.Validator
Wie wärs mit Resgen? Resource File Generator (Resgen.exe)
Edit: Evtl. ist der Zeta Resource Editor auch was für dich (bzw. den Übersetzer): http://www.zeta-resource-editor.com/download.html
Öhm, wieso nimmst Du nicht anstelle eines SVN-Checkout Commands, einfach einen SVN-Export Command?
Dann bekommst Du die .svn Ordner garnicht erst.
Sehe ich das richtig, dass MonoDroid nichts kostet? Ich meinte hier mal gelesen zu haben dass es was kostet.
BTW: Wenn ich damit entwickeln will (privat) brauche ich ein VS2010 Prof/Ultimate?
Habe ich nur auf der Arbeit, habe auch kein MSDNAA Account oder sonstiges, gibt es da keine andere Loesung? http://mono-android.net/FAQ
oder doch mit ner extension. und dann aber ganz dreißt einen Buchstabendreher reinbauen. aus Length wird Lentgh 😉 Und schon kann mans mit ner Extensionmethode machen
hmm, die Extensionmethod die ich oben gepostet habe funktioniert doch, auch mit dem Methodennamen "Length".
zumindest kompiliert das bei mir...
hmm, vielleicht solltest Du denn obigen Code mal kompilieren... ^^
Hast du schonmal die Vorschläge zum Encoding von dieser Seite getestet?
http://hellowebapps.com/products/imapx/
Wie Floste vorgeschlagen hat einfach den Namen mit + an das string.Empty anfügen.
Alternativ:
if (args.Length() == 0 || args[0] == string.Empty) {
Console.WriteLine("Bitte geben Sie den Namen des Angestellten an, den Sie feuern möchten!");
return;
}
public static class X
{
public static int Length(this string[] s)
{
return s.Length == 0 || s[0].Equals("MyUsername") ? 0 : 1;
}
}
Ich kenn zwar die meisten Klassen aus dem Code nicht, aber wäre es nicht besser
den Response-Stream an den Mp3FileReader zu übergeben, anstelle des MemoryStreams? (ich nehme mal an der Mp3FileReader liest aus dem übergebenen Stream)
double d = 120 / 100; // = 1.0
double d2 = (double)120 / 100; // = 1.2
Hi,
du mischt da zwei Dinge die so nicht zusammen passen: WebForms und MVC
Das GridView Control das du verwendest, funktioniert daher nicht ohne weiteres in einer MVC-Anwendung. Siehe auch: http://stackoverflow.com/questions/2803525/asp-net-gridview-mvc
Es gibt diverse andere Grid-Controls für MVC: http://stackoverflow.com/questions/177275/grid-controls-for-asp-net-mvc
Hi,
du darfst keinen string zurückgegeben, sondern ein MvcHtmlString-Objekt, also:
public static MvcHtmlString Image(this HtmlHelper helper, string source, string alternative)
{
return new MvcHtmlString(String.Format("<img src=\"{0}\" alt=\"{1}\" />", source, alternative));
}