2016-03-18 5 views
0

Zum Beispiel habe ich eine Zeichenfolge:Schneidfadenauslässe erste Wort mvc

string s = "Alex Amonov,Semen Polov,John S,Alex Solid"; 

ich zeigen müssen: wenn Vornamen der gleiche ist, der zweite Name alle Elemente geschnitten, außer zuerst.

Alex A , Semen , John , Alex S 

Wie kann ich das tun?

+3

Was ist, wenn es Alex Smith und Alex Solid gibt? – Kaz

+0

Warum wird Alex Solid in Ihrem erwarteten Ergebnis zu Alex S und nicht einfach zu Alex? – Szeki

+1

'Wie kann ich das tun?' Obwohl es wie eine Frage scheint, ist es nicht. Es ist einfach "schreibe es für mich?". Was hast du probiert? Was ist falsch gelaufen? – Eser

Antwort

-1

den Ausgang zu erreichen, auf die Regel-basierten Sie definiert haben, können Sie diese verwenden:

var s = "Alex Amonov,Semen Polov,John S,Alex Solid"; 

var result = ""; 
foreach (var name in Regex.Split(s, ",").Where(x => !string.IsNullOrEmpty(x))) 
{ 
    var index = name.IndexOf(" ", StringComparison.InvariantCulture); 
    result += name[0] == name[index + 1] 
     ? name.Substring(0, index) + " " + name[0] + ", " 
     : name.Substring(0, index) + ", "; 
} 

Aber beachten Sie, wäre es

Alex A, Semen, John, Alex

führen
-1

Hier ist eine Möglichkeit, über einen Algorithmus zum Generieren dieser Ausgabe nachzudenken:

  1. Split das Array auf (,) eine Liste von Namen zu erzeugen
  2. Split jeder Name in first-letzte Paare um den Raum
  3. Gruppe, die Namen in passende Vorname Gruppen
  4. Für jede Gruppe mit einem Namen (kein Duplikat Vorname), Ausgang zuerst nur nennen
  5. Für jede Gruppe mehr passenden Vornamen hat, Ausgang Vornamen plus letzten Anfang

diesen Prozess kann LINQ getan werden, mit der Spaltung und die Gruppe zu tun ing, und dann mit einem temporären Array einer Schleife, um die endgültigen Ergebnisse in der ursprünglichen Reihenfolge zu speichern, etwa so:

string s = "Alex Amonov,Semen Polov,John S,Alex Solid"; 

// split original list into separate names 
var names = s.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); 

// split names into first-last pairs, and group by matching first names groups, 
// preserving information about original order/index 
var nameGroups = names.Select((n, i) => Tuple.Create(i, n.Split(' '))).GroupBy(n => n.Item2[0]).ToList(); 

// prepare output array to store final names in original order 
var result = new string[names.Length]; 

foreach (var nameGroup in nameGroups) 
{ 
    // if only one matching first name in group, output just the first name 
    if (nameGroup.Count() == 1) 
    { 
     result[nameGroup.Single().Item1] = nameGroup.Single().Item2[0]; 
    } 
    else 
    { 
     // if multiple matching names, include first letter of last name 
     foreach (var entry in nameGroup) 
     { 
      result[entry.Item1] = entry.Item2[0] + " " + entry.Item2[1][0]; 
     } 
    } 
} 

// generate output comma-separated list of final output names in original order 
var output = string.Join(" , ", result); 
Console.WriteLine(output);  // Alex A , Semen , John , Alex S 

Es offensichtlich ein Nachteil dieser Lösung ist, wie durch @Kaz in den Kommentaren darauf hingewiesen. Wenn zwei Namen denselben Anfangsbuchstaben haben, sind sie immer noch Duplikate in der Ausgabe. In diesem Fall nehme ich an, dass es geändert werden könnte, um den vollständigen Nachnamen auszugeben.

Verwandte Themen