2017-07-18 1 views
0

Wie kann ich alle Wörter, die in einer Liste von Strings häufig vorkommen, extrahieren?C# Finden Sie alle gängigen Teilstrings in Liste <string>

Beispiel:

//Output = Bammler GOV 
    "Bammler Tokyo SA GOV" 
    "Zurich Bammler GOV" 
    "London Bammler 12 GOV" 
    "New Bammler York GOV" 

Ich habe versucht, folgende:

static void Main(string[] args) 
    { 
     List<string> MyStringList = new List<string>() 
     { 
      "Bammler Tokyo SA GOV", 
      "Zurich Bammler GOV", 
      "London Bammler 12 GOV", 
      "New Bammler York GOV" 
     }; 

     string shortest = MyStringList.OrderBy(s => s.Length).First(); 
     IEnumerable<string> shortestSubstrings = getAllSubstrings(shortest).OrderByDescending(s => s.Length); 
     var other = MyStringList.Where(s => s != shortest).ToArray(); 
     string longestCommonIntersection = string.Empty; 
     foreach (string subStr in shortestSubstrings) 
     { 
      bool allContains = other.All(s => s.Contains(subStr)); 
      if (allContains) 
      { 
       longestCommonIntersection = subStr; 
       break; 
      } 
     } 
    } 

    public static IEnumerable<string> getAllSubstrings(string word) 
    { 
     return from charIndex1 in Enumerable.Range(0, word.Length) 
       from charIndex2 in Enumerable.Range(0, word.Length - charIndex1 + 1) 
       where charIndex2 >= 2 
       select word.Substring(charIndex1, charIndex2); 
    } 

fand ich dies hier Find a common string within a list of strings aber dies wird extrahiert nur zum Beispiel "Bammler".

+2

Was hast du probiert? Sie können nicht erwarten, dass wir die ganze Arbeit für Sie erledigen ... – maccettura

+1

StackOverflow funktioniert auf diese Weise - Sie ** versuchen **, Aufgabe alleine zu lösen, und wenn Sie einige Probleme haben (Fehler oder unerwartete Ergebnisse), dann Sie Geben Sie ** Problembeschreibung **, Ihren aktuellen ** Code ** und bitten Sie die Leute, Ihnen zu helfen. –

Antwort

4

Sie können aggregate Ergebnis von Wörtern Kreuzung von allen Saiten:

var result = MyStringList.Select(s => s.Split()) 
    .Aggregate(
     MyStringList[0].Split().AsEnumerable(), // init accum with words from first string 
     (a, words) => a.Intersect(words),  // intersect with next set of words 
     a => a); 

Ausgang:

[ 
    "Bammler", 
    "GOV" 
] 
+0

Vielen Dank Sergey! – MaxPower

1

ich mit @Sergey Antwort gehen würde, aber ich möchte Sie auch einen Hash hinzufügen können verwenden Um die Kreuzung zu bekommen:

var list = new List <string>{ "Bammler Tokyo SA GOV", 
            "Zurich Bammler GOV", 
            "London Bammler 12 GOV", 
            "New Bammler York GOV"}; 

var hash = new HashSet<string> (list.First().Split(' ')); 
for (int i = 1; i < list.Count; i++) 
    hash.IntersectWith(list[i].Split(' ')); 
Verwandte Themen