如何使用where函数过滤锯齿数组

本文关键字:数组 过滤 函数 何使用 where | 更新日期: 2023-09-27 18:11:49

我有一个锯齿数组,看起来像这样:

string[][] list = new string[d.Rows.Count + 1][];
int c = 0;
        while (c < d.Rows.Count)
        {
            list[c] = new string[] 
                {
                  d.Rows[c].ItemArray[2].ToString(),
                  d.Rows[c].ItemArray[1].ToString(),
                  d.Rows[c].ItemArray[4].ToString(),
                  d.Rows[c].ItemArray[5].ToString(),
                  d.Rows[c].ItemArray[7].ToString(),
                  d.Rows[c].ItemArray[3].ToString(),
                  d.Rows[c].ItemArray[14].ToString()
                };
            c += 1;
        }
        return list;

现在,对于一个新的要求,我只需要这个数组中在这个位置的值:list[x][0]等于以下任何字符串:"Text", "FullText", "FullMatch"

我从一个常规数组开始,我可以这样做:但它显然不适用于锯齿数组。

string[][] newlist = list.where(item => item.equals("Text");

有谁知道如何扩展到我的情况?

如何使用where函数过滤锯齿数组

您可以对list执行where操作,该操作将遍历每个一维数组,然后将元素0与给定的字符串进行比较。

string[][] newlist = list
    .Where(item => item[0].Equals("Text") 
        || item[0].Equals("FullText") 
        || item[0].Equals("FullMatch"))
    .ToArray();

在一些示例数据上测试了如下所示:

        var list = new string[][]
            {
                new string[] { "Text", "A", "B", "C", "D" }, 
                new string[] { "None", "Z", "C" },
                new string[] { "FullText", "1", "2", "3" }, 
                new string[] { "FullMatch", "0", "A", "C", "Z" },
                new string[] { "Ooops", "Nothing", "Here" },
            };
        string[][] newlist = list.Where(item => item[0].Equals("Text") 
            || item[0].Equals("FullText") 
            || item[0].Equals("FullMatch")).ToArray();
        // now display all data...
        foreach (string[] row in newlist)
        {
            Console.Write("Row: ");
            foreach (string item in row)
            {
                Console.Write(item + " ");
            }
            Console.WriteLine();
        }

可以正常工作,输出为:

Row: Text A B C D
Row: FullText 1 2 3
Row: FullMatch 0 A C Z

如果您想要一个完全基于linq的解决方案,那么我认为以下应该可以做到这一点(尽管我还没有测试过,因为我不知道变量d指的是什么):

var res = 
   (from c in Enumerable.Range(0, d.Rows.Count) 
    let list = new string[] { 
        d.Rows[c].ItemArray[2].ToString(), 
        d.Rows[c].ItemArray[1].ToString(), 
        d.Rows[c].ItemArray[4].ToString(), 
        d.Rows[c].ItemArray[5].ToString(), 
        d.Rows[c].ItemArray[7].ToString(), 
        d.Rows[c].ItemArray[3].ToString(), 
        d.Rows[c].ItemArray[14].ToString() 
      }
    where list[0] == "Text" || list[0] == "FullText" || list[0] == "FullMatch"
    select list).ToArray();

锯齿数组只是数组的数组,所以你可以使用LINQ来处理它。唯一的技巧是单个项将是数组(表示列)。在使用Where之后,您可以使用ToArray将结果转换回数组:

string[][] newlist = list.Where(item => item[0] == "Text" || ... ).ToArray();