我做了控制台应用程序,它必须遍历二维字符串数组并选择包含在用户输入中的值,并在“row”中设置这些值。 不幸的是我收到错误System.Collections.Generic.List'1 [System.String] 以下是申请代码:
static void Main(string[] args)
{
string[,] words = new string[,]
{
{ "5", "" },
{ "10", "kare" },
{ "20", "kanojo" },
{ "1", "karetachi" },
{ "7", "korosu" },
{ "3", "sakura" },
{ "3", "" }
};
try
{
var pre = Console.ReadLine();
var r = Enumerable
.Range(0, words.GetLength(0))
.Where(i => words[i, 1] == pre)
.Select(i => words[i, 1])
.OrderBy(i => words[Int32.Parse(i), 0])
.ToList();
Console.Write(r);
}
catch (Exception ex)
{
TextWriter errorWriter = Console.Error;
errorWriter.WriteLine(ex.Message);
}
Console.ReadLine();
}
答案 0 :(得分:1)
这不是错误,当你显示调用List的ToString函数的结果时会发生这种情况。
(即你的陈述正确地运行,你只是没有按照你想象的方式显示它......看?)
尝试:
Console.Write(r.Aggregate((a,b) => a + "," + b));
而不是
Console.Write(r);
答案 1 :(得分:1)
您的查询不正确:您尝试将列表中的每个单词与整个用户输入相匹配,这意味着您总是会选择一个单词(假设2D数组中没有重复项)。但是,由于您要对结果进行排序,因此您可能希望存在多个单词。
要解决此问题,请将您的选择条件替换为使用Contains
,如下所示:
var r = Enumerable
.Range(0, words.GetLength(0))
.Where(i => pre.Contains(words[i, 1]))
.Select(i => new {i, w=words[i, 1]})
.OrderBy(p => Int32.Parse(words[p.i, 0]))
.Select(p=>p.w)
.ToList();
要在一行中显示结果,您可以使用string.Join
:
Console.WriteLine("Results: {0}", string.Join(", ", r));
注意:我认为练习要求您使用2D数组。如果没有这样的要求,你可以使用元组或匿名类型的数组,让你避免解析整数:
var words = new[] {
new { Priority = 5, Word = "" }
, new { Priority = 10, Word = "kare" }
, new { Priority = 20, Word = "kanojo" }
, ... // and so on
};
答案 2 :(得分:0)
以下代码创建了一个2D列表,就好像我们有这个一样 myList [] [],由[0] = {0,1,2,3}和[1] = {4,5,6,7,8}
组成List<List<int>> a2DList = new List<List<int>>()
{
new List<int>()
{
0,1,2,3
},
new List<int>()
{
4,5,6,7,8
}
};
LINQ代码 a2DList.SelectMany(s => s).ToArray()。Select(s => s)) 返回展平为1D形式的2d数组的副本。 SelectMany接受每个元素并按顺序投影每个元素的每个成员。
然后您可以说
var myObj = a2DList.SelectMany(s => s).ToArray().Select(s => s));
IEnumerable myEnumerable = a2DList.SelectMany(s => s).ToArray().Select(s => s));
int [] myArray = a2DList.SelectMany(s => s).ToArray().Select(s => s)).ToArray();
List myList = a2DList.SelectMany(s => s).ToArray().Select(s => s)).ToList();
等
由字符串运算符“ join”以打印到控制台
Console.WriteLine(string.Join(",",a2DList.SelectMany(s => s).ToArray().Select(s => s)));
//输出将为“ 0,1,2,3,4,5,6,7,8”