Hier ist was ich versuche, insgesamt zu tun. Nur um klar zu sein, das ist keine Hausaufgabe oder für einen Wettbewerb oder irgendetwas. Hoffentlich habe ich den Wortlaut klar genug gemacht:Gibt es eine elegante LINQ-Lösung für SomeButNotAll()?
Problem
ein Satz von Zeichenketten im gleichen Format gegeben, aber wo einige Ende in einem Kleinbuchstaben und einige nicht, geben einen Satz von einem jeder Zeichenfolge, die nicht in einem Kleinbuchstaben endet, aber mindestens eine identische Zeichenfolge hat, die in einem Kleinbuchstaben endet.
Beispiel
es einfach zu halten, lassen Sie uns das String-Format \d+[a-z]?
ist sagen, wo der gemeinsame Teil der Zahl ist. Gegeben {1, 4, 3a, 1b, 3, 6c}
, sollte ich eine Permutation von {1, 3}
erhalten, weil 1 und 3 am Ende beide ein Element mit und ohne einen Kleinbuchstaben haben.
Alternative Lösung
Sie können view this solution here.
Ein Weg, ich dachte, dies zu tun, die Menge in Elemente mit und ohne Kleinbuchstaben Suffix ({1, 4, 3}
und {3a, 1b, 6c}
) und kehrt dann withoutSuffix.Where(x => withSuffix.Any(y => y.StartsWith(x)))
zu partitionieren war.
Ich habe zwei Probleme:
ich keinen guten Weg, sehe in die beiden Sätze zu partitionieren, mit dem Prädikat
Regex.IsMatch(input, "[a-z]$")
. Die beiden, an die ich dachte, waren zwei ähnlich definierte Variablen, die jeweils eineWhere
-Klausel verwenden und die Regex-Übereinstimmung zweimal pro Element ausführen oder die Menge transformieren, um die Regex-Übereinstimmungsergebnisse zu speichern und daraus die beiden Variablen zu bilden.group...by
scheint nicht gut zu spielen, wenn Sie auf beide Sets zugreifen müssen, aber ich könnte mich da irren.Obwohl die Größe klein genug ist, um sich nicht um die Leistung zu kümmern, scheint
withSuffix
einmal prowithoutSuffix
Element unelegant.
Relevante Lösung
Sie können view this solution here.
Die andere Art und Weise, die in den Sinn kam, war das gemeinsame Präfix und das optionale Suffix zu greifen: {1 => {"", b}, 3 => {a, ""}, 4 => {""}, 6 => {c}}
. Dies wird einfach erreicht, indem das Präfix und das Suffix mit einer Regex ((\d+)([a-z])?
) erfasst und das Suffix durch das Präfix in grouped
gruppiert wird.
Von hier aus wäre es toll, zu tun:
where grouped.SomeButNotAll(x => x == string.Empty)
select grouped.Key
Oder auch:
where grouped.ContainsSomeButNotAll(string.Empty)
select grouped.Key
ich eine dieser sicherlich schaffen könnte, aber leider das Beste, was ich in LINQ zu sehen ist :
where grouped.Contains(string.Empty) && grouped.Any(x => x != string.Empty)
select grouped.Key
Es fühlt sich einfach super redundant an. Gibt es in LINQ schon etwas Besseres?
P.S. Ich bin offen für bessere Ansätze zur Lösung des Gesamtproblems, anstatt dies zu einem XY-Problem zu machen. Eleganz ist viel mehr als Leistung erwünscht, aber (vielleicht ist es nur ich), einfach verschwenderisch zu sein scheint immer noch unelegant.
Gute Antwort. Eventuell möchten Sie das Ergebnis jedoch am Ende deduplizieren. – moarboilerplate
@moarboilerplate Ich bin mir nicht sicher, was du meinst. Sets haben einzigartige Elemente. –
Das lässt mich fast wünschen, dass es eine Art "PartitionSelect" gibt. 'var Partitionen = input.PartitionSelect (s => char.IsLower (s.Last()), s => s.Substring (0, s.Length - 1), s => s);', mit 'Partitionen. TrueValues.Intersect (partitions.FalseValues); '(obwohl ich davon keine Hash-Sets erwarten würde). – chris