C# 数组和列表的基本知识及 LINQ 查询

news2025/2/3 19:12:57

数组和列表的基本知识及 LINQ 查询

  • 一、基本知识
  • 二、引用命名空间声明
  • 三、数组
    • 3.1、一维数组
    • 3.2、二维数组
    • 3.3、不规则数组 Jagged Array
  • 四、列表 List
    • 4.1、一维列表
    • 4.2、二维列表
  • 五、数组和列表使用 LINQ的操作和运算
    • 5.1、一维 LIST 删除所有含 double.NaN 的行
    • 5.2、一维 LIST 删除所有含指定数据的行
    • 5.3、一维 LIST 获得非重复的数列
      • 5.3.1、使用 LINQ 的 Distinct 方法
      • 5.3.2、使用 HashSet 方法
    • 5.4、二维 LIST 的声明、初始化和访问
    • 5.5、二维 LIST 使用 LINQ 筛选掉包含 double.NaN 的行及空行
    • 5.6、二维 list<list<T>> 删除 某列值相同的行
      • 5.6.1、保留第一列数据相同的首行的 LIST
      • 5.6.2、保留第一列数据相同的最后一行的 LIST
      • 5.6.3、使用LINQ去重,保留第一列数据相同的首行的 LIST
      • 5.6.4、使用LINQ去重,移除 LIST 第一列所有数据相同的行
  • 六、二维 LIST 和二维数组相互转换
    • 6.1、二维数组 int[,] 与 交错数组 int[][] 的区别
    • 6.2、二维 LIST 转换为 交错数组
    • 6.3、二维 LIST 转换为二维数组
      • 6.3.1、直接转换
      • 6.3.2、使用交错数组作为转换过程
      • 6.3.3、使用 List<数组>作为转换过程
    • 6.4、使用 LINQ,简洁地将二维数组 T[,] 转换为二维 List<List<T>>
  • 七、字符串分割成 List<T>
      • 7.1、字符串分割成 List<字符串>
      • 7.2、字符串分割为 List<int> 或 T 为其他数值类型

一、基本知识

数组和列表是 C# 操作计算数据的基础,配合 LINQ 查询可以实现代码的简洁访问。
LINQ 语言集成查询(Language Integrated Query)是.NET框架的扩展,一系列直接将查询功能集成到 C# 语言的技术统称,是一种使用类似 SQL 语句操作多种数据源的功能。List 类是 ArrayList 类的泛型等效类。数组可以是多维数据。

二、引用命名空间声明

using System;
using System.Linq;
using System.Collections.Generic;

三、数组

3.1、一维数组

double[] OneDimensionalArray = { 1.0, 2.0, double.NaN };

3.2、二维数组

double[,] TwoDimensionalArray = {
            { 1.0, 2.0, double.NaN },
            { 3.0, 4.0, 5.0 },
            { double.NaN, 6.0, 7.0 }
        }; 

3.3、不规则数组 Jagged Array

也叫交错数组。不同长度的行,可以使用 Jagged Array。使用Jagged Array时,每行的长度可以不同,这在某些情况下比使用List<List>更灵活。选择哪种方式取决于你的具体需求,比如是否需要动态改变行的长度。

int[][] jaggedArray = new int[3][]; // 声明一个三行的数组,每行的长度可以根据需要进行定义和修改。
jaggedArray[0] = new int[] { 1, 2 }; // 第一行有两个元素
jaggedArray[1] = new int[] { 3, 4, 5 }; // 第二行有三个元素
jaggedArray[2] = new int[] { 6 }; // 第三行有一个元素

四、列表 List

4.1、一维列表

List<double> OneDimensionalList = new List<double> { 1.8, 2.9, 3.7, 4.5 , double.NaN };
List<int> OneDimensionalList = new List<int> { 1, 2, 3, 4, 5 };
List<string> OneDimensionalList = new List<string> { "Alice", "Bob", "Charlie" };
List<object> OneDimensionalList = new List<object> { 1, "Hello", 3.14 };

4.2、二维列表

严格不叫二维,但可以等效数组一样操作,姑且这么称呼。

List<List<int>> TwoDimensionalList = new List<List<int>>() {
          new List<int> { 1, 2, 3 },
          new List<int> { 4, 5, 6 },
          new List<int> { 7, 8, 9 },
};


List<List<int>> TwoDimensionalList = new List<List<int>>();
TwoDimensionalList.Add(new List<int> { 1, 2, 3 });// 添加行
TwoDimensionalList.Add(new List<int> { 4, 5, 6 });
TwoDimensionalList.Add(new List<int> { 7, 8, 9 });

五、数组和列表使用 LINQ的操作和运算

5.1、一维 LIST 删除所有含 double.NaN 的行

List<double> OneDimensionalList = new List<double> { 1.8, 2.9, 3.7, 4.5 , double.NaN, 168 };
OneDimensionalList.RemoveAll(n => double.IsNaN(n));

5.2、一维 LIST 删除所有含指定数据的行

List<string> OneDimensionalList = new List<string> { 
"Alice TWO Y", 
"Bob WO", 
"Charlie who Y"
"Hi LIST"
};
foreach (string row in OneDimensionalList)
{
    string[] SplitString = row.Split(' ');//行数据分裂
    if (SplitString[2] == "Y")//第3个字符等于Y的
    {
     OneDimensionalList.RemoveAll(x => x == row);//删除第3列等于字符Y的行
    }
}

// 在指定位置插入元素(例如,在索引为2的位置插入7)
 OneDimensionalList.Insert(2, 7);
 
// 移除指定值的第一个匹配项(如果有的话)
OneDimensionalList.Remove(7); // 如果7存在,则移除它
OneDimensionalList.RemoveAt(0); // 移除索引为0的元素,即原本的1
OneDimensionalList.Clear(); // 清空列表中的所有元素
bool containsThree = OneDimensionalList.Contains(3); //检查元素是否存在于列表中,如果3存在,返回true,否则返回false
int count =  OneDimensionalList.Count; // 获取列表中的元素数量

5.3、一维 LIST 获得非重复的数列

5.3.1、使用 LINQ 的 Distinct 方法

List<string> OneDimensionalList = new List<string> { 
"Alice TWO Y", 
"Bob WO", 
"Charlie who Y"
"Hi LIST"
"Charlie who Y"
};
OneDimensionalList = OneDimensionalList.Distinct().ToList();//返回非重复的数列
OneDimensionalList.Sort();//排序

5.3.2、使用 HashSet 方法

List<string> OneDimensionalList = new List<string> { 
"Alice TWO Y", 
"Bob WO", 
"Charlie who Y"
"Hi LIST"
"Charlie who Y"
};
HashSet<string> hs = new HashSet<string>(OneDimensionalList); //HashSet存储一组不重复的元素
OneDimensionalList = hs.ToList(); 
OneDimensionalList.Sort();//排序

5.4、二维 LIST 的声明、初始化和访问

//声明新的二维列表
List<List<int>> twoDimensionalList = new List<List<int>>();

//初始化二维列表 List ,添加 3 行 4 列
twoDimensionalList.Add(new List<int> { 1, 2, 3, 4 });//添加一维 List 元素
twoDimensionalList.Add(new List<int> { 5, 6, 7, 8 });
twoDimensionalList.Add(new List<int> { 9, 10, 11, 12 });

// 获取二维列表行数
int rowCount = twoDimensionalList.Count;

// 获取二维列表列数
int columnCount = twoDimensionalList.Count == 0 ? 0 : twoDimensionalList[0].Count;
int cols = twoDimensionalList.Select(row => row.Count).Max(); // 假设所有行长度相同,如果不是,需要处理不一致的情况

//简单访问二维 List 元素或值
int element = twoDimensionalList[0][1]; // 获取第一行、第二列元素的值(行索引为 0,列索引为 1),值为 2
Console.WriteLine(element);
twoDimensionalList[1][2] = 5; // 将第二行第三列的元素修改为5


//遍历二维列表,控制台输出
foreach (List<int> row in twoDimensionalList)
{
   foreach (int item in row)
    {
        Console.Write(item + " ");//控制台调试显示数据
    }
     Console.WriteLine();
}

foreach (var row in twoDList)
{
    foreach (var item in row)
    {
        Console.Write(item + " ");
    }
    Console.WriteLine(); // 换行,用于分隔各行
}

//遍历二维列表,修改数据,控制台输出,
for (int i = 0; i < rowCount; i++)
{
    for (int j = 0; j < columnCount; j++)
    {
       twoDimensionalList[i][j] += 1;//修改数据,二维数据每个数加 1
    }
}

//二维数组或 LIST 控制台显示,采用 Join 输出行数据
foreach (var row in TwoDimensionalArray)
{
  Console.WriteLine(string.Join(", ", row));
}

foreach (var row in TwoDimensionalList)
{
  Console.WriteLine(string.Join(", ", row));
}

//删除列表行,索引默认从零开始
twoDimensionalList.RemoveAt(2);//删除索引 2 的行数据

//删除集合中一定范围内的元素,索引默认从零开始
twoDimensionalList.RemoveRange(0, 2);//从索引 0 开始,删除 2 行数据

//在列表索引前插入元素(在第二行之前插入)
twoDimensionalList.Insert(1, new List<int> { 15, 16, 17, 18 });

//在特定位置插入新行,初始化为 0(在第一行之前插入)
twoDList.Insert(0, new List<int>(Enumerable.Repeat(0, cols)));

//初始化一个具有特定大小和内容的二维List
int rows = 3;
int cols = 4;
List<List<int>> twoDList = new List<List<int>>();
for (int i = 0; i < rows; i++)
{
    twoDList.Add(new List<int>(Enumerable.Repeat(0, cols))); // 添加一个新行,初始化为0
}

5.5、二维 LIST 使用 LINQ 筛选掉包含 double.NaN 的行及空行

 
 List<List<double>> TwoDimensionalList = new List<List<double>>()
 {
      new List<double> {  1.8, 2.9, 3.7, 4.5, 9.9, 168 },
      new List<double> {  1.8, 2.9, 3.7, 4.5, double.NaN, 168 },
      new List<double> { }, // 空行
      new List<double> {  2.8, 3.9, 4.7, 5.5, double.NaN, 668, },
      new List<double> {  1.8, 2.9, 3.7, 4.5, 9.9, 168 }
 };

 TwoDimensionalList = TwoDimensionalList.Where(row => !row.Contains(double.NaN) && row.Any()).ToList();//删除存在 double.NaN 的行及空行

// TwoDimensionalList = TwoDimensionalList.Where(row => row.Any()).ToList();//删除空行
// TwoDimensionalList = TwoDimensionalList.Where(row => !row.Contains(double.NaN)).ToList();//删除存在 double.NaN 的行

foreach (var row in TwoDimensionalList) { Console.WriteLine(string.Join(" ", row)); }

 //var filteredData = twoDimensionalList.Where(row => !row.Contains(double.NaN)).ToArray();

5.6、二维 list<list> 删除 某列值相同的行

5.6.1、保留第一列数据相同的首行的 LIST

         List<List<int>> list1 = new List<List<int>>
        {
            new List<int> { 1, 2 }, //第一列数据相同的行
            new List<int> { 3, 4 },
            new List<int> { 1, 5 }, //第一列数据相同的行
            new List<int> { 6, 7 },
            new List<int> { 1, 6 }  //第一列数据相同的行
        };

            // 检查第一列(索引为0)
            int columnIndex = 0;
            var seen = new HashSet<int>(); // 用于跟踪已经看到的值
            for (int i = 0; i < list1.Count; i++) // 从 0 索引开始遍历行
            {
                if (!seen.Add(list1[i][columnIndex])) // 如果值已存在,则删除当前行
                {
                    list1.RemoveAt(i); // 如果值已存在,则删除当前行
                }
            }

            foreach (var row in list1)
            {
                Console.WriteLine(string.Join(", ", row));
            }
            Console.WriteLine();

结果:
1, 2
3, 4
6, 7

5.6.2、保留第一列数据相同的最后一行的 LIST

            List<List<int>> list2 = new List<List<int>>
        {
            new List<int> { 1, 2 }, //第一列数据相同的行
            new List<int> { 3, 4 },
            new List<int> { 1, 5 }, //第一列数据相同的行
            new List<int> { 6, 7 },
            new List<int> { 1, 6 }  //第一列数据相同的行
        };

            int columnIndex = 0;// 检查第一列(索引为0)
            var uniqueValues = new HashSet<int>();
            for (int i = list2.Count - 1; i >= 0; i--) // 从后往前遍历以便安全删除元素
            {
                if (!uniqueValues.Add(list2[i][columnIndex]))
                {
                    list2.RemoveAt(i); // 如果值已存在,则删除当前行
                }
            }

            foreach (var row in list2)
            {
                Console.WriteLine(string.Join(", ", row));
            }
            Console.WriteLine(); 

结果:
3, 4
6, 7
1, 6

5.6.3、使用LINQ去重,保留第一列数据相同的首行的 LIST

        List<List<int>> list3 = new List<List<int>>
        {
            new List<int> { 1, 2 }, //第一列数据相同的行
            new List<int> { 3, 4 },
            new List<int> { 1, 5 }, //第一列数据相同的行
            new List<int> { 6, 7 },
            new List<int> { 1, 6 }  //第一列数据相同的行
        };
        
        int columnIndex = 0;// 检查第一列(索引为0)
        list3 = list3.GroupBy(x => x[columnIndex]).Select(g => g.First()).ToList(); // 去重并保留第一个遇到的元素。
        foreach (var row in list3)
        {
           Console.WriteLine(string.Join(", ", row)); // 输出结果。
        }

结果:
1, 2
3, 4
6, 7

        List<List<int>> list = new List<List<int>>()
        {
            new List<int> { 1, 2 }, //第一列数据相同的行
            new List<int> { 3, 4 },
            new List<int> { 1, 5 }, //第一列数据相同的行
            new List<int> { 6, 7 },
            new List<int> { 1, 6 },  //第一列数据相同的行
            new List<int> { 1, 2, 3 },//第一列数据相同的行
            new List<int> { 4, 5, 6 },
            new List<int> { 1, 7, 8 }, //第一列数据相同的行
            new List<int> { 9, 10, 11 }
        };

            int columnIndex = 0;// 检查第一列(索引为0)
            // 只保留每组中的第一个元素(如果有重复值的话)
            list = list.Where((item, index) => index == list.FindIndex(x => x[columnIndex] == item[columnIndex])) 
                                       .ToList();

            // 打印结果以验证
            foreach (var sublist in list)
            {
                Console.WriteLine(string.Join(", ", sublist));
            }
            return;

结果:
1, 2
3, 4
6, 7
4, 5, 6
9, 10, 11

5.6.4、使用LINQ去重,移除 LIST 第一列所有数据相同的行

            List<List<int>> listOfLists = new List<List<int>>()
        {
            new List<int> { 1, 2, 3 },
            new List<int> { 4, 5, 6 },
            new List<int> { 1, 7, 8 }, // 这里有两行包含1
            new List<int> { 9, 10, 11 }
        };

            // 需要检查的列索引(例如第0列)
            int columnIndex = 0;

            // 获取该列的所有值及其出现的次数
            var duplicates = listOfLists.GroupBy(list => list[columnIndex])
                                        .Where(group => group.Count() > 1)
                                        .Select(group => group.Key)
                                        .ToList();

            // 移除所有包含重复值的行
            listOfLists.RemoveAll(list => duplicates.Contains(list[columnIndex]));

            // 打印结果以验证
            foreach (var list in listOfLists)
            {
                Console.WriteLine(string.Join(", ", list));
            }

结果:
4, 5, 6
9, 10, 11

六、二维 LIST 和二维数组相互转换

6.1、二维数组 int[,] 与 交错数组 int[][] 的区别

二维 LIST 转换为二维数组 double[][] arrayOfArrays,严格说不是二维数组。
关于 double[][] 是交错数组,它其实是一个 double[] 里嵌套着double[],可以理解为 (double[])[]。

对于int[,],数组的行数和列数如下:

int[,] a=new int[2,3];
int row = a.GetLength(0);  //第一维的长度(即行数)  row=2;
int col = a.GetLength(1); //第二维的长度(即列数)col=3;
int length = a.Length;//二维数组的总长度  lenth=6;

对于交错数组 int[][]

int[][] a = { new int[] { 1, 5 }, new int[] { 7, 3 }, new int[] { 3, 5 } };
   //accounts.Length表示数组a中一维数组的个数3
   for (int i = 0; i < accounts.Length; i++)
   {
     int col = accounts[i].Length;//表示一维数组中其中一维数组的个数,看上面数组a,那么这里数组的个数就为2
     int sum = 0;
      for (int j = 0; j < col; j++)
       {
         sum = sum + accounts[i][j];
       }         
    }

6.2、二维 LIST 转换为 交错数组

List<List<double>> TwoDimensionalList = new List<List<double>>
{
    new List<double> { 1, 2, 3 },
    new List<double> { 4, 5, 6 },
    new List<double> { 7, 8, 9 }
};
//此二维数组不是double[,] arrayOfArrays 数组       
double[][] arrayOfArrays = TwoDimensionalList.Select(row => row.ToArray()).ToArray();

6.3、二维 LIST 转换为二维数组

6.3.1、直接转换

List<List<string>> lists = new List<List<string>>()
{
  new List<string>() { "C", "C++" },
  new List<string>() { "Java", "Kotlin" }
};

string[,] arrays = new string[lists.Count, lists[0].Count];
for (int i = 0; i < lists.Count; i++)
{
     for (int j = 0; j < lists[i].Count; j++)
     {
         arrays[i, j] = lists[i][j];
     }
}

//控制台输出二维数组结果
foreach (var array in arrays)
{
      Console.WriteLine(String.Join(", ", array));
}

//控制台输出结果(取数组的行列大小)
for (int i = 0; i < arrays.GetLength(0); i++)
{
     for (int j = 0; j < arrays.GetLength(1); j++)
     {
          Console.Write(arrays[i, j] + " ");
     }
     Console.WriteLine();
}

//控制台输出结果(取lists的行列大小)
int rows = lists.Count;
int cols = lists[0].Count;
for (int i = 0; i < rows; i++)
{
     for (int j = 0; j < cols; j++)
     {
         Console.Write(arrays[i, j] + " ");
     }
     Console.WriteLine();
}

6.3.2、使用交错数组作为转换过程

List<List<double>> TwoDimensionalList = new List<List<double>>
{
new List<double> { 1, 2, 3 },
new List<double> { 4, 5, 6 },
new List<double> { 7, 8, 9 }
};
//先转换为行列规则的交错数组形式 double[][] arrayOfArrays
double[][] arrayOfArrays = TwoDimensionalList.Select(row => row.ToArray()).ToArray();

int rows = arrayOfArrays.Length;//交错数组行数
int cols = arrayOfArrays.Max(array => array.Length);//交错数组列数
double[,] multiDimArray=new double[rows, cols];//声明二维数组
//转换为二维数组
for (int i = 0; i < rows; i++)
{
     for (int j = 0; j < cols; j++)
     {
          multiDimArray[i, j] = arrayOfArrays[i][j]; // 直接赋值
     }
}
//控制台输出结果
for (int i = 0; i < multiDimArray.GetLength(0); i++)
{
     for (int j = 0; j < multiDimArray.GetLength(1); j++)
     {
          Console.Write(multiDimArray[i, j] + " ");
     }
     Console.WriteLine();
}

6.3.3、使用 List<数组>作为转换过程

方法1

 List<List<int>> TwoDimensionalList = new List<List<int>>() {
          new List<int> { 1, 2, 3 },
          new List<int> { 4, 5, 6 },
          new List<int> { 7, 8, 9 }
            };
// 将List<List<int>>转换为List<int[]>
var listOfArrays = TwoDimensionalList.Select(row => row.ToArray()).ToList();

int[,] array = new int[listOfArrays.Count, listOfArrays[0].Length];
for (int i = 0; i < listOfArrays.Count; i++)
{
     for (int j = 0; j < listOfArrays[i].Length; j++)
     {
         array[i, j] = listOfArrays[i][j];
     }
}

// 输出结果验证
for (int i = 0; i < array.GetLength(0); i++)
{
     for (int j = 0; j < array.GetLength(1); j++)
     {
         Console.Write(array[i, j] + " ");
     }
     Console.WriteLine();
}

方法2

        // 示例二维List
        List<List<int>> listOfLists = new List<List<int>>
        {
            new List<int> { 1, 2, 3 },
            new List<int> { 4, 5, 6 },
            new List<int> { 7, 8, 9 }
        };
 
        // 将List<List<int>>转换为List<int[]>
        List<int[]> listOfArrays = new List<int[]>();
        foreach (var list in listOfLists)
        {
            listOfArrays.Add(list.ToArray());
        }
 
 
        // 然后将List<int[]>转换为二维数组int[,]
        int[,] array = new int[listOfArrays.Count, listOfArrays[0].Length];
        for (int i = 0; i < listOfArrays.Count; i++)
        {
            for (int j = 0; j < listOfArrays[i].Length; j++)
            {
                array[i, j] = listOfArrays[i][j];
            }
        }
 
        // 输出结果验证
        for (int i = 0; i < array.GetLength(0); i++)
        {
            for (int j = 0; j < array.GetLength(1); j++)
            {
                Console.Write(array[i, j] + " ");
            }
            Console.WriteLine();
        }

6.4、使用 LINQ,简洁地将二维数组 T[,] 转换为二维 List<List>

int[,] TwoDimensionalArray = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int rowCount = TwoDimensionalArray.GetLength(0);
int colCount = TwoDimensionalArray.GetLength(1);

List<List<int>> TwoDimensionalList = Enumerable.Range(0, rowCount)
                    .Select(i => Enumerable.Range(0, colCount)
                    .Select(j => TwoDimensionalArray[i, j])
                    .ToList())
                    .ToList();

七、字符串分割成 List

7.1、字符串分割成 List<字符串>

string input = "apple,banana,cherry";
List<string> result = new List<string>(input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));

7.2、字符串分割为 List 或 T 为其他数值类型

string input = "1,2,3,4,5";
List<int> result = input.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                                .Select(int.Parse)
                                .ToList();
 
foreach (var item in result)
{
    Console.WriteLine(item);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2291406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…

洛谷 P8724 [蓝桥杯 2020 省 AB3] 限高杆

洛谷题目传送门 题目描述 某市有 n 个路口&#xff0c;有 m 段道路连接这些路口&#xff0c;组成了该市的公路系统。其中一段道路两端一定连接两个不同的路口。道路中间不会穿过路口。 由于各种原因&#xff0c;在一部分道路的中间设置了一些限高杆&#xff0c;有限高杆的路…

虚幻UE5手机安卓Android Studio开发设置2025

一、下载Android Studio历史版本 步骤1&#xff1a;虚幻4.27、5.0、5.1、5.2官方要求Andrd Studio 4.0版本&#xff1b; 5.3、5.4、5.5官方要求的版本为Android Studio Flamingo | 2022.2.1 Patch 2 May 24, 2023 虚幻官网查看对应Andrd Studiob下载版本&#xff1a; https:/…

JavaWeb入门-请求响应(Day3)

(一)请求响应概述 请求(HttpServletRequest):获取请求数据 响应(HttpServletResponse):设置响应数据 BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器就可访问,应用程序的逻辑和数据都存储在服务端(维护方便,响应速度一般) CS架构:Client/ser…

【Rust】18.2. 可辩驳性:模式是否会无法匹配

喜欢的话别忘了点赞、收藏加关注哦&#xff08;加关注即可阅读全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 18.2.1. 模式的两种形式 模式有两种形式&#xff1a; 可辩驳的&#xff08;可失败的&…

【SLAM】于AutoDL云上GPU运行GCNv2_SLAM的记录

配置GCNv2_SLAM所需环境并实现AutoDL云端运行项目的全过程记录。 1. 引子 前几天写了一篇在本地虚拟机里面CPU运行GCNv2_SLAM项目的博客&#xff1a;链接&#xff0c;关于GCNv2_SLAM项目相关的介绍请移步此文章&#xff0c;本文不再重复说明。 GCNv2: Efficient Corresponde…

【自然语言处理(NLP)】基于Transformer架构的预训练语言模型:BERT 训练之数据集处理、训练代码实现

文章目录 介绍BERT 训练之数据集处理BERT 原理及模型代码实现数据集处理导包加载数据生成下一句预测任务的数据从段落中获取nsp数据生成遮蔽语言模型任务的数据从token中获取mlm数据将文本转换为预训练数据集创建Dataset加载WikiText-2数据集 BERT 训练代码实现导包加载数据构建…

41【文件名的编码规则】

我们在学习的过程中&#xff0c;写出数据或读取数据时需要考虑编码类型 火山采用&#xff1a;UTF-16 易语言采用&#xff1a;GBK php采用&#xff1a;UTF-8 那么我们写出的文件名应该是何种编码的&#xff1f;比如火山程序向本地写出一个“测试.txt”&#xff0c;理论上这个“测…

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达&#xff0c;需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据&#xff0c;并进行 实时 3D 点云可视化。数据通过 串口 传输&#xff0c;并经过解析后转换为 三维坐标点&#xff0c;最终使用 pcplayer 进…

沙皮狗为什么禁养?

各位铲屎官们&#xff0c;今天咱们来聊聊一个比较敏感的话题&#xff1a;沙皮狗为什么会被禁养&#xff1f;很多人对沙皮狗情有独钟&#xff0c;但有些地方却明确禁止饲养这种犬种&#xff0c;这背后到底是什么原因呢&#xff1f;别急&#xff0c;今天就来给大家好好揭秘&#…

Dest1ny漏洞库:用友 U8 Cloud ReleaseRepMngAction SQL 注入漏洞(CNVD-2024-33023)

大家好&#xff0c;今天是Dest1ny漏洞库的专题&#xff01;&#xff01; 会时不时发送新的漏洞资讯&#xff01;&#xff01; 大家多多关注&#xff0c;多多点赞&#xff01;&#xff01;&#xff01; 0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP&#xff0c;主要聚…

DeepSeek-R1模型1.5b、7b、8b、14b、32b、70b和671b有啥区别?

deepseek-r1的1.5b、7b、8b、14b、32b、70b和671b有啥区别&#xff1f;码笔记mabiji.com分享&#xff1a;1.5B、7B、8B、14B、32B、70B是蒸馏后的小模型&#xff0c;671B是基础大模型&#xff0c;它们的区别主要体现在参数规模、模型容量、性能表现、准确性、训练成本、推理成本…

#define,源文件与头文件,赋值表达式

1.#define 1.1定义 #define 是一个预处理指令&#xff0c;用于定义宏 宏&#xff0c;是预处理阶段&#xff08;在编译之前&#xff09;由预处理器处理的代码片段 1.2使用 1.2.1 #define 可以定义常量 #define PI 3.14159 1.2.2 #define 可以定义宏函数 #define SQUARE(x) ((…

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B

5分钟在本地PC上使用VLLM快速启动DeepSeek-R1-Distill-Qwen-32B 前言环境准备所需工具创建虚拟环境安装VLLM及依赖库 模型下载安装Hugging Face CLI下载DeepSeek-R1-Distill-Qwen-32B 模型启动启动命令启动确认 模型验证发送API请求示例输出 注意事项参考链接 前言 VLLM 是一个…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.13 降维打击:扁平化操作的六种武器

1.13 降维打击&#xff1a;扁平化操作的六种武器 目录 #mermaid-svg-bbLxDryjxBbXe3tu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-bbLxDryjxBbXe3tu .error-icon{fill:#552222;}#mermaid-svg-bbLxDryjxBbXe3tu…

Oracle Primavera P6 最新版 v24.12 更新 2/2

目录 一. 引言 二. P6 EPPM 更新内容 1. 用户管理改进 2. 更轻松地标准化用户设置 3. 摘要栏标签汇总数据字段 4. 将里程碑和剩余最早开始日期拖到甘特图上 5. 轻松访问审计数据 6. 粘贴数据时排除安全代码 7. 改进了状态更新卡片视图中的筛选功能 8. 直接从活动电子…

AI-on-the-edge-device - 将“旧”设备接入智能世界

人工智能无处不在&#xff0c;从语音到图像识别。虽然大多数 AI 系统都依赖于强大的处理器或云计算&#xff0c;但**边缘计算**通过利用现代处理器的功能&#xff0c;使 AI 更接近最终用户。 本项目演示了使用 **ESP32**&#xff08;一种低成本、支持 AI 的设备&#xff09;进行…

Openfga 授权模型搭建

1.根据项目去启动 配置一个 openfga 服务器 先创建一个 config.yaml文件 cd /opt/openFGA/conf touch ./config.yaml 怎么配置&#xff1f; 根据官网来看 openfga/.config-schema.json at main openfga/openfga GitHub 这里讲述详细的每一个配置每一个类型 这些配置有…

C++模板编程——可变参函数模板之折叠表达式

目录 1. 什么是折叠表达式 2. 一元左折 3. 一元右折 4. 二元左折 5. 二元右折 6. 后记 上一节主要讲解了可变参函数模板和参数包展开&#xff0c;这一节主要讲一下折叠表达式。 1. 什么是折叠表达式 折叠表达式是C17中引入的概念&#xff0c;引入折叠表达式的目的是为了…

ArkTS渲染控制

文章目录 if/else:条件渲染ArkUI通过自定义组件的build()函数和@Builder装饰器中的声明式UI描述语句构建相应的UI。在声明式描述语句中开发者除了使用系统组件外,还可以使用渲染控制语句来辅助UI的构建,这些渲染控制语句包括控制组件是否显示的条件渲染语句,基于数组数据快…