-2

你好,我有点卡住了,我不知道如何在字符串中找到第三长的单词,我有我的代码来找到最长的单词,但我无法让它找到第三长的单词。有什么帮助吗?

public void longestWord()
    {
        string sentance, word;
        word = " ";
        char[] a = new char[] { ' ' };
        sentance = textBox1.Text;  //<--string here


        foreach (string s1 in sentance.Split(a))
        {
            if (word.Length < s1.Length)
            {
                word = s1;
            }
        }
        label9.Text = ("The longest word is " + word + " and its length is " + word.Length + " characters long");
    }

PS字符串即时测试的一个例子是:

    1.

DarkN3ss 是我最有经验的基于 Windows 的商业解决方案提供商。我专注于通过最好地理解这些技术和方向来提供我的商业价值。DarkN3ss 根据我在 Windows 和 Linux 产品方面的能力和经验,将我视为实施解决方案的“精英业务合作伙伴”。

4

6 回答 6

2

使用linq怎么样?

sentance.Split(' ').OrderByDescending(w => w.Length).Skip(2).FirstOrDefault()

在一个函数中:

public void nthLongestWord(int index = 0)
{
    string word = null;
    if(index <= 0)
    {
        word = sentance.Split(' ').OrderByDescending(w => w.Length).FirstOrDefault();
    }
    else
    {
        word = sentance.Split(' ').OrderByDescending(w => w.Length).Skip(index - 1).FirstOrDefault();
    }


    if(!string.IsNullOrWhitespace(word))
    {
        label9.Text = ("The longest word is " + word + " and its length is " + word.Length + " characters long");
    }
    else 
    {
        // display something else?
    }
}
于 2012-11-21T02:14:08.947 回答
1

如果您想对当前代码进行最少的更改,那么您应该做的是存储三个最长的单词(即,而不是word、 have word1word2word3,或者如果您愿意,可以使用数组)。

然后,在 if 语句中,设置 word3=word2、word2=word1 和 word1=s1。

这样,第三大单词将在word3.

不是最有效的,但您可以在一定程度上保留当前代码。

于 2012-11-21T02:11:31.547 回答
1

解决方案:获取所有第三大词

   string[] splitStr = sentence.Split(' ');

   if (splitStr.Length > 2)
   {
        List<int> allLengths = splitStr.Select(x => x.Length).Distinct().ToList();

        int thirdLargestWordLength = allLengths.OrderByDescending(x => x)
                                               .Skip(2).Distinct().Take(1).FirstOrDefault();

        if (splitStr[0].Length != thirdLargestWordLength && 
         splitStr[1].Length != thirdLargestWordLength)
         {

            string[] theThirdLargestWords = splitStr.Where(x => x.Length == thirdLargestWordLength)
                                                                  .ToArray();


             if (theThirdLargestWords.Length == 1)
             {
                label9.Text = "The third longest word is " + theThirdLargestWords[0];
             }
             else
             {
                string words = "";

                for (int i = 0; i < theThirdLargestWords.Length; i++)
                {
                   if (i == 0)
                   {
                     words = theThirdLargestWords[i];
                }
               //else if ((i + 1) == theThirdLargestWords.Length)
               //{
               //   words += " and " + theThirdLargestWords[i];
               //}
                else
                {
                    words += ", " + theThirdLargestWords[i];
                }
             }

             label9.Text = "The third longest words are " + words;
        }
      }
   }

我注释掉了“and”部分,因为我不确定你是否想要在你的字符串中。我还添加了第一个 if 语句,这样如果您的单词少于 3 个,您就不会收到错误消息。

于 2012-11-21T02:29:10.733 回答
0

如果你觉得使用临时数组很舒服,你应该在那里复制你的单词,对它们进行排序并取第三长的单词。

于 2012-11-21T02:08:59.743 回答
0

这可能有编译错误,但只是为了给你一个想法。

var words = sentence.split();

words.OrderBy (w => w.length ).ToArray ()[2]

于 2012-11-21T02:17:49.190 回答
0

GroupBy 长度解决方案

var thirdLongests = words.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).GroupBy(x => x.Length).OrderByDescending(x => x.Key).Skip(2).First().ToArray();
于 2012-11-21T02:54:48.677 回答