使用LINQ在二维字符串数组上进行迭代和选择
本文关键字:数组 迭代 选择 字符串 二维 LINQ 使用 | 更新日期: 2023-09-27 18:29:38
我做了控制台应用程序,该应用程序必须迭代二维字符串数组,并选择用户输入中包含的值,并按"行"显示这些值。很遗憾,我得到了错误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();
}
您的查询不正确:您试图将列表中的每个单词与整个用户输入相匹配,这意味着您总是选择一个单词(假设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));
注意:我假设练习需要使用二维阵列。如果没有这样的要求,您可以使用元组或匿名类型的数组,从而避免解析整数:
var words = new[] {
new { Priority = 5, Word = "" }
, new { Priority = 10, Word = "kare" }
, new { Priority = 20, Word = "kanojo" }
, ... // and so on
};
演示。
这不是错误,当您显示调用List的ToString函数的结果时就会发生这种情况。
(也就是说,你的陈述运行正确,只是没有按照你想象的方式显示……看到了吗?)
尝试:
Console.Write(r.Aggregate((a,b) => a + "," + b));
而不是
Console.Write(r);
下面的代码创建了一个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();
etc
This is "join"ed by the string operator for printing out to Console
Console.WriteLine(string.Join(",",a2DList.SelectMany(s => s).ToArray().Select(s => s)));
//输出将为"0,1,2,3,4,5,6,7,8"