C#常见问题解决方案手册(即查即用)

目录

C#正则表达式

C#语言之字符串和正则表达式

C# 正则表达式判断IP地址是否合法

C#:string字符串处理

c#字符串按行读取

C#数值转固定长度字符串

C#字符串转换为数字(不考虑异常)——推荐不考虑异常的字符串转数字

C#字符串判断是否相等(忽略大小写)——推荐使用

c#怎样取到某个特定字符后面的字符,比如XXXXX#123 和 XXX#12中#后面的数字

C# 截取字符串最后一个字符

C# 提取字符串中所有数字的分组

C#: byte字节处理

C#: byte.ToString("x2")字节转16进制字符串

C#运算符

C# 运算符 ??、?: 的用法和说明

winform控件处理

C# 将ComboBox设置为禁止编辑的方法

C# SplitContainer的panel1的宽度不变

C# winfrom 菜单中快捷键的设置

C#遍历窗体所有控件或某类型所有控件

C#怎么获取当前单击的控件名称,比如有100个Button 一个button_Click() ,点击按钮后显示所点击的按钮名称

Timer控件定时操作

ListView操作:新增列行、设置属性颜色、清除内容

C#TextBox设置默认值(获取焦点后默认值消失)

c#TextBox输入框自动提示、补全功能(仅限单行文本框)

C#委托

通过Action或Func的形式实现函数当做参数传递的效果

C# WINFORM窗体间通过委托和事件传值(自定义事件参数)--实例详解

C#一段非常经典的属性值改变引发自定义事件的例子

C#类型转换

c#as和强制转换

C#DataGridView

C# DataGridView 禁止列排序

C#DataGridView默认的第一列

C#中DataGridView动态添加行及添加列的方法

C# 调试方法

C# debug调试信息打印及输出

C#多线程

C#获得当前线程的ID

C#创建线程Thread

C#反射

C#通过“程序集.命名空间.类名”获取实例

C#Linq

Linq查询操作符

C#XML

C#按名称读取节点和属性


问题来自实际项目中遇到的问题,解决方法来自网络收集,最后更新时间2020.1.8

 

C#正则表达式

C#语言之字符串和正则表达式

C# 正则表达式判断IP地址是否合法

System.Text.RegularExpressions.Regex rx = new System.Text.RegularExpressions.Regex(@"((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))");
if (rx.IsMatch(str_ip) == false)
{
    MessageBox.Show("IP地址不合法!");
}

C#:string字符串处理

c#字符串按行读取

string Content;
string[] ContentLines = Content.Split(new string[] { "\r\n" }, StringSplitOptions.None);//不忽略空行
string[] ContentLines = Content.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); //忽略空行

C#数值转固定长度字符串

//固定长度字符串处理
//int类型转固定长度
Console.WriteLine(string.Format("{0:D5}", 111));
 //长度超出则显示原值
Console.WriteLine(string.Format("{0:D5}", 222222222));
 
//字符串转固定长度
//使用PadLeft方法可以自定义填充值
string str = "333";
Console.WriteLine(str.PadLeft(10));
Console.WriteLine(str.PadLeft(10, '0'));
Console.WriteLine(str.PadRight(10));
Console.WriteLine(str.PadRight(10, '0'));

结果:

C#字符串转换为数字(不考虑异常)——推荐不考虑异常的字符串转数字

str为null或其他不规则字符串时转换失败,直接返回为d=0,不用考虑异常;

double d;
string str="18";
double.TryParse(str, out d)
//使用TryParse转换时没有异常,转换失败返回0

C#字符串判断是否相等(忽略大小写)——推荐使用

string str="point"
if(string.Compare(str, "POINT", true) == 0)

//public static int Compare(string strA, string strB, bool ignoreCase);
// 摘要:
        //     比较两个指定的 System.String 对象(其中忽略或考虑其大小写),并返回一个整数,指示二者在排序顺序中的相对位置。
        //
        // 参数:
        //   strA:
        //     要比较的第一个字符串。
        //
        //   strB:
        //     要比较的第二个字符串。
        //
        //   ignoreCase:
        //     要在比较过程中忽略大小写,则为 true;否则为 false。
        //
        // 返回结果:
        //     一个 32 位带符号整数,指示两个比较数之间的词法关系。值条件小于零strA 小于 strB。零strA 等于 strB。大于零strA 大于 strB。

 

c#怎样取到某个特定字符后面的字符,比如XXXXX#123 和 XXX#12中#后面的数字

string a = "XXXXX#eee";
string arr = a.Split('#')[1];
Console.Write(arr);

C# 截取字符串最后一个字符

k = k.Substring(k.Length-1, 1);

C# 提取字符串中所有数字的分组

[C#].NET/C#应用程序编程开发中从字符串中查找并提取数字的方法有哪些呢?

string input = "There are 4 numbers in this string: 40, 30, and 10.";
string[] numbers = Regex.Split(input, @"\D+");
foreach (string value in numbers)
{
    if (!string.IsNullOrEmpty(value))
    {
    int i = int.Parse(value);
    Console.WriteLine("Number: {0}", i);
    }
}

 

结果为:Number: 4 Number: 40 Number: 30 Number: 10

C#: byte字节处理

C#: byte.ToString("x2")字节转16进制字符串

  • 转化为16进制
  • 大写X:ToString("X2")即转化为大写的16进制
  • 小写x:ToString("x2")即转化为小写的16进制
  • 2表示输出两位,不足的2位的前面补0,如 0x0A 如果没有2,就只会输出0xA

 

C#运算符

C# 运算符 ??、?: 的用法和说明

三元(运算符)表达式——?:
例如:x?y:z 表示如果表达式x为true,则返回y;如果x为false,则返回z,是省略if{}else{}的简单形式。

空合并运算符——??
如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。
例如:a??b 当a为null时则返回b,a不为null时则返回a本身。
空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(b??c)”计算。

winform控件处理

C# 将ComboBox设置为禁止编辑的方法

将ComboBox的DropDownStyle 属性设置为 DropDownList即可:

  • Simple 简单的下拉列表框(始终显示列表);
  • DropDown 可以编辑,与有下拉列表(默认);
  • DropDownList 只有下拉列表,不能编辑。

C# SplitContainer的panel1的宽度不变

ISsplitterFixed属性设为true(禁止拆分器的移动),FixedPanel属性设为panel1(不随窗体大小改变panel1的宽度)。

C# winfrom 菜单中快捷键的设置

一个菜单中有   文件(F)   查看(V)  收藏(A),不用鼠标去点,直接按Alt+F打开文件,按Alt+V打开查看,按Alt+A打开收藏。

在各个菜单控件的Text上写上(&字母)即可:

文件(F) :文件(&F) 

查看(V) :查看(&V) 

收藏(A) :收藏(&A)

C#遍历窗体所有控件或某类型所有控件

遍历所有TextBox类型控件或者所有DateTimePicker控件(使用as进行类型转换、效率更高)

foreach (Control control in this.Controls)
{
  //遍历所有TextBox...
    if (control is TextBox)
    {
        TextBox t = (TextBox)control;
        t.Enabled = false;
    }
  //遍历所有DateTimePicker...
    if (control is DateTimePicker)
    {
        DateTimePicker d = (DateTimePicker)control;
        d.Enabled = false;
    }
}

C#怎么获取当前单击的控件名称,比如有100个Button 一个button_Click() ,点击按钮后显示所点击的按钮名称

可以通过Click事件中传递过来的sender对象获取按钮名称(Button)sender.Name,方法也适用于其它控件的其它事件

private void button1_Click(object sender, EventArgs e)
{
    Button button = (Button)sender;
    MessageBox.Show(button.Name);
}

Timer控件定时操作

        #region Timer控件定时操作
        private void button3_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            timer1.Interval = 1000;//1秒1次
            timer1.Tick += new EventHandler(tmr_Tick);
            timer1.Start();
        }
 
        private void tmr_Tick(object sender, EventArgs e)
        {
            //到达设定时间后的事件
            label1.Text = DateTime.Now.ToString() + "执行了";
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            timer1.Enabled = false;
        }
        #endregion

ListView操作:新增列行、设置属性颜色、清除内容

            //ListView新增列
            listView1.Columns.Add("年龄", 100, HorizontalAlignment.Center);
            listView1.Columns.Add("班级", 80, HorizontalAlignment.Center);
            listView1.Columns.Add("性别", 40, HorizontalAlignment.Center);
            listView1.Columns.Add("职业", 100, HorizontalAlignment.Center);
            button5.Enabled = false;
 
            //ListView新增行 批量更新防闪烁
            listView1.BeginUpdate();
            listView1.Items.Add("row1", "张三", 0);
            listView1.Items["row1"].SubItems.Add("21");
            listView1.Items["row1"].SubItems.Add("98001");
            listView1.Items["row1"].SubItems.Add("男");
            listView1.Items["row1"].SubItems.Add("学生");
 
            listView1.Items.Add("row2", "李四", 0);
            listView1.Items["row2"].SubItems.Add("22");
            listView1.Items["row2"].SubItems.Add("98002");
            listView1.Items["row2"].SubItems.Add("女");
            listView1.Items["row2"].SubItems.Add("教师");
 
            listView1.Items.Add("row3", "王五", 0);
            listView1.Items["row3"].SubItems.Add("23");
            listView1.Items["row3"].SubItems.Add("98003");
            listView1.Items["row3"].SubItems.Add("男");
            listView1.Items["row3"].SubItems.Add("工程师");
 
            listView1.Items.Add("row4", "赵六", 0);
            listView1.Items["row4"].SubItems.Add("24");
            listView1.Items["row4"].SubItems.Add("98004");
            listView1.Items["row4"].SubItems.Add("女");
            listView1.Items["row4"].SubItems.Add("公务员");
            listView1.EndUpdate();
 
            //设置ListView属性
            listView1.GridLines = true;
            listView1.View = View.Details;
            listView1.LabelEdit = false;
            listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
 
            //更改行颜色
            for (int i = 0; i < listView1.Items.Count; i++)
            {
                if (i % 2==0)
                {
                    listView1.Items[i].BackColor = Color.Gray;
                }
            }
 
            listView1.Items.Clear(); //清除列表内容 不包含表头
 
            listView1.Clear(); //清除列表包含表头

结果:

C#TextBox设置默认值(获取焦点后默认值消失)

原文:Winform给TextBox设置默认值(获取焦点后默认值消失)

主要是通过TextBox的获取焦点Enter和失去焦点Leave两个事件来实现的,

思路如下:

   1.设置一个字符串常量,作为TextBox的默认值;

   2.在界面的构造方法中将默认值赋值给TextBox,并设置TextBox的ForeColor为灰色;

   3.编写获取焦点事件 TextBox_Enter(object sender, EventArgs e) ,判断TextBox的Text是否等于默认值,

      是:则将TextBox内容清空,并将前景色ForeColor改成正常的颜色

   4.失去焦点事件 TextBox_Leave(object sender, EventArgs e),判断TextBox的Text是否为空,如果为空,则再次以灰色来显示默认值

具体的代码如下:

    //TextBox的默认值
    private const String DEFAULT_TEXT = "Please enter your words.";
    //构造方法
    public Form1()
    {
         //...其他代码

         //为TextBox设置默认值和默认值的前景色(字体颜色)
         SetDefaultText();
     }

     private void SetDefaultText()
     {
            textBox1.Text = DEFAULT_TEXT;
            textBox1.ForeColor = Color.Gray;
     }

     //获取焦点事件 Enter
     private void textBox1_Enter(object sender, EventArgs e)
     {
            if (textBox1.Text == DEFAULT_TEXT)
            {
                textBox1.Text = "";
                textBox1.ForeColor = Color.Black;
            }
        }

        //失去焦点事件 Leave
        private void textBox1_Leave(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(textBox1.Text))
                SetDefaultText();
        }

结果:

c#TextBox输入框自动提示、补全功能(仅限单行文本框)

        private void Form1_Load(object sender, EventArgs e)
        {
            //仅限单行文本框使用
            var txtSource = new AutoCompleteStringCollection();
            txtSource.AddRange(new string[]
                    {
                        "January",
                        "February",
                        "March",
                        "April",
                        "May",
                        "June"
                    });

            //使用 AutoCompleteSource 属性使 TextBox 控件能够接受其自动完成行为的自定义源 
            textBox1.AutoCompleteCustomSource = txtSource;
            //使用 AutoCompleteMode 属性设置自动完成候选人的显示方式            
            textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            //使用 AutoCompleteCustomSource 属性设置值的自定义列表
            textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        }

C#委托

通过Action或Func的形式实现函数当做参数传递的效果

参考文章:https://www.crifan.com/csharp_pass_function_as_parameter_using_action_or_func/

//职能的宣布和执行
public void updateProgress(int percentage)
{
    pgbDownload.Value = percentage;
}

//调用其他函数,将函数作为参数传递
getUrlRespStreamBytes(xxx, updateProgress);

//其他相关功能
public int getUrlRespStreamBytes(xxx, Action<int> funcUpdateProgress)
{
    //...    
    if (funcUpdateProgress != null)
    {
        int currentPercent = 20;
        funcUpdateProgress(currentPercent);
    }   
    //...

}

【总结】

  • 此处是当做参数要传递的函数没有返回值,所以可以用Action<paras>的形式;
  • 如果当做参数要传递的函数,是有返回值的话,就要改为Func<paras, returnValue>的形式了;
  • Action与Func的区别参考C#中的Action和Func和Predicate,此文章只描述实际问题解决方法。

C# WINFORM窗体间通过委托和事件传值(自定义事件参数)--实例详解

代码比较简单,其中的原理可以参考一下。

想看实际运行效果的请访问原文:https://codedefault.com/p/csharp-winform-pass-value-between-forms-by-delegate-and-event

赋值窗体代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DelegatePassValue
{
  public partial class frmAddress : Form
  {
    //声明一个更新Address的委托
    public delegate void AddressUpdateHandler(object sender, AddressUpdateEventArgs e);
    //声明一个更新Address的事件
    public event AddressUpdateHandler AddressUpdated;

    public frmAddress()
    {
      InitializeComponent();
    }

    private void btnOk_Click(object sender, EventArgs e)
    {
      var args = new AddressUpdateEventArgs(txtCountry.Text, txtState.Text, txtCity.Text, txtZipCode.Text);
      AddressUpdated(this,args);
      this.Dispose();
    }

    private void btnCancel_Click(object sender, EventArgs e)
    {
      this.Dispose();
    }
  }

  public class AddressUpdateEventArgs : System.EventArgs
  {
    private string mCountry;
    private string mState;
    private string mCity;
    private string mZipCode;
    public AddressUpdateEventArgs(string sCountry, string sState, string sCity, string sZipCode)
    {
      this.mCountry = sCountry;
      this.mState = sState;
      this.mCity = sCity;
      this.mZipCode = sZipCode;
    }
    public string Country { get { return mCountry; } }
    public string State { get { return mState; } }
    public string City { get { return mCity; } }
    public string ZipCode { get { return mZipCode; } }
  }
}

主窗体代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace DelegatePassValue
{
  public partial class frmMain : Form
  {
    public frmMain()
    {
      InitializeComponent();
    }

    private void btnSetAddress_Click(object sender, EventArgs e)
    {
      var frmAddr = new frmAddress();
      frmAddr.AddressUpdated += new frmAddress.AddressUpdateHandler(AddressForm_ButtonClicked);
      frmAddr.Show();
    }

    private void AddressForm_ButtonClicked(object sender, AddressUpdateEventArgs e)
    {
      txtCountry.Text = e.Country;
      txtState.Text = e.State;
      txtCity.Text = e.City;
      txtZipCode.Text = e.ZipCode;
    }

    private void btnClose_Click(object sender, EventArgs e)
    {
      Application.Exit();
    }
  }
}

C#一段非常经典的属性值改变引发自定义事件的例子

    public class MyClass
    {
        public event EventHandler<PropertyChagedEventArgs> MyPropertyChanging;
        public event EventHandler<PropertyChagedEventArgs> MyPropertyChanged;

        private int _myProperty;
        public int MyProperty
        {
            get { return _myProperty; }
            set
            {
                if (value != _myProperty)
                {
                    PropertyChagedEventArgs e = new PropertyChagedEventArgs("MyProperty", _myProperty, value);//初始化
                    if (this.MyPropertyChanging != null)
                    {
                        this.MyPropertyChanging(this, e);
                        if (e.Cancel) return;
                    }
                    _myProperty = (int)e.NewValue;
                    if (this.MyPropertyChanged != null)
                    {
                        this.MyPropertyChanged(this, e);
                    }
                }
            }
        }


    }

    /// <summary>
    /// 通用的类
    /// </summary>
    public class PropertyChagedEventArgs : EventArgs
    {
        public PropertyChagedEventArgs(string propertyName,object oldValue,object newValue)
        {
            PropertyName = propertyName;
            OldValue = oldValue;
            NewValue = newValue;
        }

        public bool Cancel { get; set; }
        public string PropertyName { get; private set; }
        public object OldValue { get; private set; }
        public object NewValue { get; set; }
    }

C#类型转换

c#as和强制转换

内容来自:https://www.cnblogs.com/rush/archive/2011/05/13/as_is.html

C#是一门强类型语言,一般情况下,我们最好避免将一个类型强制转换为其他类型,但有些时候难免要进行类型转换。

先想想究竟哪些操作可以进行类型转换(先不考虑.NET提供的Parse),一般我们都有以下选择:

  • 使用as操作符转换,

  • 使用传统C风格的强制转型

  • 使用is来做一个转换测试,然后再使用as操作符或者强制转

正确的选择应该是尽可能地使用as操作符,因为它比强制转型要安全,而且在运行时层面也有比较好的效率(注意的是as和is操作符都不执行任何用户自定义的转换,只有当运行时类型与目标转换类型匹配时,它们才会转换成功)。

as只能用于引用类型不能用于值类型。

as和强制转换之间最大的区别就在于如何处理用户自定义的转换。操作符 as和 is 都只检查被转换对象的运行时类型,并不执行其他的操作。如果被转换对象的运行时类型既不是所转换的目标类型,也不是其派生类型,那么转型将告失败。但是强制转型则会使用转换操作符来执行转型操作,这包括任何内建的数值转换(如:long转int)。

一般情况我们应该先考虑使用as进行类型转换,然后再考虑使用is,最后才考虑使用强制转换。

C#DataGridView

C# DataGridView 禁止列排序

SortMode是DataColumn的属性值,通过DataGridView获取DataColumn,然后将DataColumn的SortMode属性设置也可以达到同样的目的。

DataGridView中的Columns属性里面可以设置。进入“Edit  Columns”窗口后,在相应的列属性设置里面把SortMode属性选择为"NotSortable"就可以了。

for (int i = 0; i < this.dataGridView1.Columns.Count; i++)
{
    this.dataGridView1.Columns[i].SortMode = DataGridViewColumnSortMode.NotSortable;    
}

C#DataGridView默认的第一列

创建DGV会默认添加第一列,默认的第一列为RowHeaders,也就是行标题列,可设置DGV的RowHeadersVisible属性控制其显示与否。

C#中DataGridView动态添加行及添加列的方法

Datagridview添加列:

DataGridViewTextBoxColumn acCode = new DataGridViewTextBoxColumn();
acCode.Name = "acCode";
acCode.DataPropertyName = "acCode";
acCode.HeaderText = "A/C Code";
dgvVouchers.Columns.Add(acCode);

Datagridview创建行:

DataGridViewRow dr = new DataGridViewRow();
dr.CreateCells(dgvVouchers);
//填充行数据
string[]strs=new string[dgvVouchers.Columns.Count];
//...写数组的值...
dr.SetValues(strs);
//添加的行作为第一行
dgvVouchers.Rows.Insert(0, dr);
//添加的行作为最后一行
dgvVouchers.Rows.Add(dr);

C# 调试方法

C# debug调试信息打印及输出

debug提供了许多调试指令,只在[debug模式下才执行](运行按钮后面的下拉框可选)  

//断言:将出现一个对话框  
System.Diagnostics.Debug.Assert(false,"信息"); 

//下例将信息存入磁盘文件
System.Diagnostics.TextWriterTraceListener   t=new   System.Diagnostics.TextWriterTraceListener(@"c:/a.txt");   
System.Diagnostics.Debug.Listeners.Add(t);  
System.Diagnostics.Debug.WriteLine("信息");   
t.Flush();

//将信息输出到窗口不保存
System.Diagnostics.Debug.WriteLine("信息");     
      

C#多线程

官方线程介绍:https://docs.microsoft.com/zh-cn/dotnet/standard/threading/?view=netframework-4.8

C#获得当前线程的ID

网络上常见的AppDomain.GetCurrentThreadId().ToString()方法已经过时,禁止使用。

常用方法:

//推荐
Thread.CurrentThread.ManagedThreadId.ToString()

C#创建线程Thread

C#反射

C#通过“程序集.命名空间.类名”获取实例

“反射”其实就是利用程序集的元数据信息。 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间。

假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):

Assembly assembly = Assembly.LoadFile(“程序集路径,不能是相对路径”); // 加载程序集(EXE 或 DLL) 
object obj = assembly.CreateInstance(“类的完全限定名(即包括命名空间)”); // 创建类的实例

若要反射当前项目中的类(即当前项目已经引用它了)可以为:

// 获取当前程序集 
Assembly assembly = Assembly.GetExecutingAssembly();
// 创建类的实例,返回为 object 类型,需要强制类型转换
object obj = assembly.CreateInstance(“类的完全限定名(即包括命名空间)”); 



//也可以为:
Type type = Type.GetType(“类的完全限定名”); 
object obj = type.Assembly.CreateInstance(type);

 

通用反射帮助类,通过“程序集.命名空间.类名”返回指定类型对象:

     /*参考:http://www.cnblogs.com/encoding/archive/2010/09/10/1823399.html
     *     http://www.cnblogs.com/encoding/archive/2010/09/10/1823444.html
     * */
    /// <summary>
    /// 反射帮助类
    /// </summary>
    public static class ReflectionHelper
    {
        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="fullName">命名空间.类型名</param>
        /// <param name="assemblyName">程序集</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string fullName, string assemblyName)
        {
            string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
            Type o = Type.GetType(path);//加载类型
            object obj = Activator.CreateInstance(o, true);//根据类型创建实例
            return (T)obj;//类型转换并返回
        }

        /// <summary>
        /// 创建对象实例
        /// </summary>
        /// <typeparam name="T">要创建对象的类型</typeparam>
        /// <param name="assemblyName">类型所在程序集名称</param>
        /// <param name="nameSpace">类型所在命名空间</param>
        /// <param name="className">类型名</param>
        /// <returns></returns>
        public static T CreateInstance<T>(string assemblyName, string nameSpace, string className)
        {
            try
            {
                string fullName = nameSpace + "." + className;//命名空间.类型名
                //此为第一种写法
                object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例
                return (T)ect;//类型转换并返回
                //下面是第二种写法
                //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集
                //Type o = Type.GetType(path);//加载类型
                //object obj = Activator.CreateInstance(o, true);//根据类型创建实例
                //return (T)obj;//类型转换并返回
            }
            catch
            {
                //发生异常,返回类型的默认值
                return default(T);
            }
        }
    }

C#Linq

Linq查询操作符

参考:https://www.jianshu.com/p/a10bf285dcf7

//Linq查询操作符
string[] words = { "zero","one", "two", "three", "four" };
int[] numbers = { 0, 1, 2, 3, 4 };

//1.聚合
numbers.Sum();
numbers.Average();
numbers.Count();
numbers.LongCount(x => x % 2 == 0);
words.Min();
words.Max();
numbers.Aggregate((a, b) => (a + b));

//2.链接
numbers.Concat(new[] { 2, 3, 4, 5, 6 });

//3.转换
words.Cast<string>()  //遍历时遇到转换失败的地方,会抛出异常
words.OfType<string>()
numbers.ToArray();
numbers.ToList();
words.ToDictionary(w => w.Substring(0, 2));
numbers.Concat(new[] { 2, 3, 4, 5, 6 });

//4.元素操作符
words.ElementAt(2);
words.ElementAtOrDefault(10);
words.First();
words.First(w => w.Length == 3);
words.First(w => w.Length == 10); //异常:没有匹配的元素
words.FirstOrDefault (w => w.Length == 10); //null
words.Last(); //"four“
words.Single(); //异常:不止一个元素
words.SingleOrDefault(); //异常:不止一个元素
words.Single(word => word.Length == 5); //“three“   返回唯一元素
words.Single(word => word.Length == 10); //异常:没有匹配的元素
words.SingleOrDefault(w => w.Length == 10); //null   返回唯一元素

//5.相等操作
words.SequenceEqual(new[]{“ZERO”,“ONE”,“TWO”,“THREE”,“FOUR”},StringComparer.OrdinalIgnoreCase);

//6.生成
numbers.DefaultIfEmpty(); //0, 1, 2, 3, 4
Enumerable.Range(0, 100);
Enumerable.Repeat(25, 2);//生成包含重复值的序列
Enumerable.Empty<int>();//生成任意类型的空序列

//7.分组
words.GroupBy(word => word.Length);

//8.连接
words.Join(allStrings, name => name[0], color => allStrings[0],(name, color) => name + " - " + color);
words.GroupJoin

//9.分部
words.Take(2); //"zero", "one"
words.Skip(2); //"two","three", "four"
words.TakeWhile(word => word.Length <= 4); //"zero", "one", "two"
words.SkipWhile(word => word.Length <= 4); //"three","four“

//10.投影
words.Select(word => word.Length);// 4, 3, 3, 5, 4
words.Select((word, index) => index.ToString() + ": " + word); //"0: zero", "1: one", "2: two","3: three", "4: four"
words.SelectMany(word => word.ToCharArray());//'z', 'e', 'r', 'o', 'o', 'n', 'e', 't', 'w', 'o', 't','h', 'r', 'e', 'e', 'f', 'o', 'u', 'r'

//11.数量
words.All(word => word.Length > 3); //false("one"和"two"的确包含3个字母)
words.All(word => word.Length > 2); //true
words.Any(); //true(序列不为空)
words.Any(word => word.Length == 6); //false(没有6个字母的单词)
words.Any(word => word.Length == 5); //true("three"满足这个条件)
words.Contains("FOUR"); //false
words.Contains("FOUR",StringComparer.OrdinalIgnoreCase); //true

//12.过滤
 words.Where(word => word.Length > 3); //"zero", "three", "four“

//13.基于集的操作符
"abbc".Distinct(); //"a", "b", "c"
"abbc".Intersect("cd"); //"c"
"abbc".Union("cd");//"a", "b", "c", "d"
"abbc".Except("cd"); //"a", "b"
"cd".Except("abc"); //"d“

//14.排序
words.OrderBy(word => word);
words.Reverse();
words.OrderByDescending(word => word.Length);

C#XML

C#按名称读取节点和属性

        string filePath = System.Environment.CurrentDirectory + "/xmlName.xml";
        if (File.Exists(filePath))
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(filePath); 
            //选择匹配 XPath 表达式的第一个 XmlNode           
            XmlNodeList node = xmlDoc.SelectSingleNode("root").ChildNodes;
            //遍历节点
            foreach (XmlNode ele in node)
            {
                if (ele.NodeType != XmlNodeType.Element) continue;
                if (ele.Name == "eleName")
                {
                    //读取eleName节点下name属性的值
                    string name= (ele.Attributes.GetNamedItem("name") as XmlAttribute).Value;
                    
                }
            }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值