使用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();
}

使用LINQ在二维字符串数组上进行迭代和选择

您的查询不正确:您试图将列表中的每个单词与整个用户输入相匹配,这意味着您总是选择一个单词(假设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"