我正在试图解决一个关于代码学院的项目中的一个任务,任务是在tsv文件中找到一个单词,该单词由以下代码组成:
List<Language> languages = File.ReadAllLines("./languages.tsv")
.Skip(1)
.Select(line => Language.FromTsv(line))
.ToList();我尝试了以下操作,得到了错误CS1929:
var ChiefDeveloperMS = languages.Where(chief => $"{chief.Contains("Microsoft")}");
foreach (var d in ChiefDeveloperMS)
{
Console.WriteLine($"{d.Prettify()}");
}我要找的词是微软。
Prettify是语言类中的一种方法,其代码如下:
public string Prettify()
{
return $"{Year}, {Name}, {ChiefDeveloper}, {Predecessors}";
}tsv文件中的示例:
Year Name Chief developer, company Predecessor(s)
1991 Visual Basic Alan Cooper (sold to Microsoft) QuickBASIC
2001 GDScript(GDS) OKAM Studio Godot
2001 Shakespeare Programming Language Jon Åslund, Karl Hasselström none
2002 Io Steve Dekorte Self,NewtonScript,Lua
2002 Gosu Guidewire Software GScript
2005 F# Don Syme (Microsoft Research) OCaml,C#,Haskell我在控制台中得到的输出:
1996, VBScript, Microsoft, Visual Basic
2001, Visual Basic .NET, Microsoft, Visual Basic
2006, Windows PowerShell, Microsoft, C#,ksh,Perl,CL,DCL,SQL预期产出:
1991 Visual Basic Alan Cooper (sold to Microsoft) QuickBASIC
1996 VBScript Microsoft Visual Basic
2000 C# Anders Hejlsberg (Microsoft, ECMA) C,C++,Java,Delphi,Modula-2
2001 Visual Basic .NET Microsoft Visual Basic
2005 F# Don Syme (Microsoft Research) OCaml,C#,Haskell
2006 Windows PowerShell Microsoft C#,ksh,Perl,CL,DCL,SQL我已经尝试了许多不同的版本,搜索了所有的代码学院facebook组,但仍然找不到答案,正确的名称空间在progam.cs的顶端。
昨天,我得到了关于堆栈溢出的解决方案的帮助,它在某种程度上起了作用,但问题是它没有在控制台上的tsv文件中输出括号中的单词。
以下是解决方案代码:
var ChiefDeveloperMS = languages.Where(chief => chief.ChiefDeveloper == "Microsoft");语言类的构造函数:
public Language(int year, string name, string chiefDeveloper, string predecessors)
{
Year = year;
Name = name;
ChiefDeveloper = chiefDeveloper;
Predecessors = predecessors;
}当我多次成功地使用.Contain()方法时,我不明白为什么它不能工作。
我该放弃这件事以后再谈这个吗?这对初学者来说太复杂了吗?
我是新来的,如果需要更多的信息,我将乐于编辑我的帖子。
发布于 2020-08-29 18:54:13
所以,原因是:
var ChiefDeveloperMS = languages.Where(chief => $"{chief.Contains("Microsoft")}");不起作用是因为一切都搞砸了
其中是一个LINQ命令,它希望您将一个函数传递给它,该函数返回布尔值(或计算结果为布尔值和
chief => $"{chief.Contains("Microsoft")}"不是一个导致布尔值的表达式。我把它拆开,让你知道出了什么问题
chief =>给将传递给表达式/函数的list元素命名。您正在调用语言对象列表中的位置,所以调用这个lang比酋长更好。chief是(/lang )语言对象。如果您想获得它的ChiefDeveloper属性,您必须说chief.ChiefDeveloper ->,您明白为什么我建议查看对象集合并为集合中的项选择一个很好的单数引用的名称吗?lang.ChiefDeveloper比chief.ChiefDeveloper更有意义,并帮助您在头脑中清楚地了解使用的内容。
$"启动内插字符串。
内插字符串中的
{标志着计算的字段的开始。
chief.Contains("Microsoft")是个问题。Contains询问字符串是否包含另一个字符串,但请记住,chief是语言对象,而不是字符串。语言没有包含方法。如果是的话,它将返回true或false,这将通过插值过程合并到字符串中,您将得到以下字符串之一:“真”“假”
这些不是布尔人。它们是字符串,包含我们在谈论布尔语时常用的词,但它们不是布尔词,"1234“不是数字或时间,"04-09-2000”不是日期。这些都是字符串,不管你的大脑在看到它们时会识别和解释什么(哦,4月9日还是9月4日?)
把所有这些放在一起,正确命名集合,命名表达式输入变量,确保它返回布尔值.
var msLangs = allLangs.Where(lang => lang.ChiefDeveloper.Contains("Microsoft"));您现在可以迭代并打印它们:
foreach (var msLang in msLangs)
{
Console.WriteLine(msLang.Prettify());
}注意,我保留了合理的命名-集合有复数名称
languages
您不需要将msLang.Prettify放入内插字符串中。漂亮已经返回了一个字符串。将其封装在不包含其他任何内容的内插字符串中是浪费的操作。
我还想指出,prettify不会以您想要输出的格式返回字符串。漂亮加逗号
因为可以公平地说,您对问题的说明并不像它可能的那样准确,所以我不确定是否要修复这最后一点。要么修改你的漂亮,这样它就会发出制表符而不是逗号,要么绕过美化,自己插入一个字符串。
我想提出的另一点(也是最后一点)是,软件工程师按照规格要求工作,而规格必须绝对准确、完整、全面等等。希望这整个经历对你来说是值得的,因为在一开始,你的规范很糟糕;它根本无法实现--这是你老板会在你办公桌上放下来期待你做的那种半生不熟的事情,如果你这么做了,假设你给了他一些他不想要的东西。在与其他软件开发人员交谈时,一定要小心注意您的规范的准确性和它的完整性。总是,当收到某人的规格说明时,要求同样的。否则它将是“垃圾进入,垃圾输出”。
发布于 2020-08-29 13:48:26
tsv文件是TAB分隔的文件。您发布的数据没有选项卡。下面的代码将处理包含选项卡的文件。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.txt";
static void Main(string[] args)
{
DataTable dt = new DataTable();
int row = 0;
StreamReader reader = new StreamReader(FILENAME);
string line = "";
while ((line = reader.ReadLine()) != null)
{
string[] data = line.Split(new char[] { '\t' });
if (++row == 1)
{
foreach (string name in data)
{
dt.Columns.Add(name, typeof(string));
}
}
else
{
dt.Rows.Add(data);
}
}
}
}
}https://stackoverflow.com/questions/63647296
复制相似问题