C# c查找列表

C# c查找列表,c#,string,list,linq,find,C#,String,List,Linq,Find,如何提取字符串列表中常见的所有单词 例如: //Output = Bammler GOV "Bammler Tokyo SA GOV" "Zurich Bammler GOV" "London Bammler 12 GOV" "New Bammler York GOV" 我尝试了以下几点: static void Main(string[] args) { List<string> MyStringList = new List<

如何提取字符串列表中常见的所有单词

例如:

//Output = Bammler GOV
  "Bammler Tokyo SA GOV"
  "Zurich Bammler GOV"
  "London Bammler 12 GOV"
  "New Bammler York GOV"
我尝试了以下几点:

    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);
    }
我在这里找到了这个,但这将仅提取例如Bammler。

您可以从所有字符串中得到单词相交的结果:

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);
输出:

[
  "Bammler",
  "GOV"
]
您可以从所有字符串中选择单词相交的结果:

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);
输出:

[
  "Bammler",
  "GOV"
]

我会选择@Sergey answer,但我想补充一点,您也可以使用散列来获取交叉点:

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(' '));

我会选择@Sergey answer,但我想补充一点,您也可以使用散列来获取交叉点:

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(' '));

你试过什么?你不能指望我们为你做所有的工作…StackOverflow的工作方式是这样的-你尝试自己解决任务,如果你有一些问题或错误或意外的结果,那么你给出问题描述,你当前的代码,并请别人帮助你。你尝试了什么?你不能指望我们为你做所有的工作…StackOverflow的工作方式是这样的-你尝试自己解决任务,如果你有一些问题或意外的结果,那么你给出问题描述,你的当前代码,并请别人帮助你。非常感谢Sergey!非常感谢,谢尔盖!