好的,所以我知道像这样的问题已经在这里被问了很多,但我似乎无法使解决方案有效。 我试图从文件中取一个字符串,找到该字符串中最长的单词。 Simples。
我认为问题在于我是在string[]
还是char[]
调用我的方法,目前stringOfWords
会返回char[]
。
我尝试按降序排序并获得第一个值,但我在ArgumentNullException
方法上获得OrderByDescending
。
任何输入都非常赞赏。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace TextExercises
{
class Program
{
static void Main(string[] args)
{
var fileText = File.ReadAllText(@"C:\Users\RichardsPC\Documents\TestText.txt");
var stringOfWords = fileText.ToArray();
Console.WriteLine("Text in file: " + fileText);
Console.WriteLine("Words in text: " + fileText.Split(' ').Length);
// This is where I am trying to solve the problem
var finalValue = stringOfWords.OrderByDescending(n => n.length).First();
Console.WriteLine("Largest word is: " + finalValue);
}
}
}
答案 0 :(得分:3)
在这种情况下,方法ToArray()
返回char[]
,这是一个单独字符的数组。但相反,你需要一系列单词。你可以这样得到它:
string[] stringOfWords = fileText.Split(' ');
你的lambda表达式中有一个拼写错误(大写L):
n => n.Length
答案 1 :(得分:2)
试试这个:
var fileText = File.ReadAllText(@"C:\Users\RichardsPC\Documents\TestText.txt");
var words = fileText.Split(' ')
var finalValue = fileText.OrderByDescending(n=> n.Length).First();
Console.WriteLine("Longest word: " + finalValue");
答案 2 :(得分:2)
如果你关心性能,你不想拆分字符串。为了执行拆分方法,必须遍历整个字符串,为找到的项创建新字符串进行拆分,将它们放入数组中,计算成本超过N
,然后通过另一个(至少)O(nLog(n))
步骤执行订单。
你可以使用正则表达式来提高效率,因为它只会迭代字符串一次
var regex = new Regex(@"(\w+)\s",RegexOptions.Compiled);
var match = regex.Match(fileText);
var currentLargestString = "";
while(match.Success)
{
if(match.Groups[1].Value.Length>currentLargestString.Length)
{
currentLargestString = match.Groups[1].Value;
}
match = match.NextMatch();
}
关于这一点的好处是你不需要一次性破坏字符串来进行分析,如果你需要以递增的方式加载文件,那么只需要在对象中保留单词就可以了。将其称为多个字符串
您只需要查找最大的项目就不需要执行订单,大多数情况下{order for}的计算复杂度,迭代列表的复杂度为O(nLog(n))
< / p>
O(n)
答案 3 :(得分:1)
正如其他答案中所建议的那样,你需要拆分你的字符串。
string[] stringOfWords = fileText.split(new Char [] {',' , ' ' });
//all is well, now let's loop over it and see which is the biggest
int biggest = 0;
int biggestIndex = 0;
for(int i=0; i<stringOfWords.length; i++) {
if(biggest < stringOfWords[i].length) {
biggest = stringOfWords[i].length;
biggestIndex = i;
}
}
return stringOfWords[i];
我们在这里做的是根据空格(&#39;&#39;)或逗号分割字符串 - 你可以在那里添加无限数量的分隔符 - 然后,每个单词都有自己的分隔符数组中的空间。
从那里,我们重复遍历数组。如果我们遇到一个比当前最长的单词更长的单词,我们会更新它。