使用LINQ迭代并选择二维字符串数组

时间:2014-11-07 15:12:53

标签: c# arrays linq console-application

我做了控制台应用程序,它必须遍历二维字符串数组并选择包含在用户输入中的值,并在“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();
}

3 个答案:

答案 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
};

Demo.

答案 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”