C# Enumerable类 之 数据筛选

news2025/2/28 14:03:33

总目录


前言

在 C# 中,System.Linq.Enumerable 类是 LINQ(Language Integrated Query)的核心组成部分,它提供了一系列静态方法,用于操作实现了 IEnumerable 接口的集合。通过这些方法,我们可以轻松地对集合进行查询、转换、排序和聚合等操作。

本文属于 C# Enumerable类 使用详解 中的一个章节,着重介绍 C# Enumerable 类中数据筛选这部分的内容。


一、概览

方法描述示例
Where条件过滤nums.Where(n => n > 10)
OfType类型过滤list.OfType<string>()
Distinct去重names.Distinct()

二、Where :条件过滤

1. 什么是Where

Where 是 LINQ 提供的一个扩展方法,用于根据指定的谓词(predicate)筛选集合中的元素。它适用于实现了 IEnumerable 接口的任何类型,包括数组、列表和其他可枚举集合。

2. where 方法 基本信息

1) Where

Where用于从集合中筛选出满足特定条件的元素。

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, int, bool> predicate);
  • 参数
    • source:要筛选的源序列。
    • predicate:一个返回布尔值的函数,用于确定是否应包含某个元素。
      • 第一个重载仅传递元素本身给谓词函数。
      • 第二个重载除了传递元素本身外,还传递该元素在序列中的索引位置。
  • 返回值:一个包含满足谓词条件的元素的序列。

2)工作原理

Where 方法会遍历集合中的每个元素,并根据提供的谓词函数判断是否应包含该元素。如果谓词函数返回 true,则该元素会被包含在结果集中;如果返回 false,则忽略该元素。

3)使用场景

  • 数据过滤:当需要从集合中筛选出满足某些条件的数据时,可以使用 Where 方法。
  • 数据清洗:在处理用户输入或其他外部数据源时,筛选出有效或符合条件的数据。
  • 性能优化:通过提前过滤掉不符合条件的数据,减少后续处理的数据量。

3. 使用示例

示例 1:基本用法

假设我们有一个包含数字的列表,我们可以使用 Where 方法筛选出偶数。

    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };
        var evenNumbers = numbers.Where(n => n % 2 == 0);

        Console.WriteLine(string.Join(",",evenNumbers));
        //输出:2,4,6
    }

在这个例子中,我们创建了一个包含数字的列表 numbers,然后使用 Where 方法筛选出了所有偶数。

示例 2:复杂条件

我们可以在谓词函数中使用更复杂的逻辑来筛选数据。例如,筛选出所有偶数且小于10的数字。

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

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        var filteredNumbers = numbers.Where(n => n % 2 == 0 && n < 10);

        foreach (var num in filteredNumbers)
        {
            Console.WriteLine(num); // 输出: 2 4 6 8
        }
    }
}

在这个例子中,我们使用了复合条件来筛选出所有偶数且小于10的数字。

示例 3:结合其他 LINQ 方法

Where 可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 Where 方法筛选出符合条件的元素,然后再使用 Select 方法进行转换。

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

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 },
            new Person { Name = "David", Age = 20 }
        };

        var filteredPeople = people
            .Where(p => p.Age > 25) // 筛选出年龄大于25的人
            .Select(p => p.Name);   // 只选择名字

        foreach (var name in filteredPeople)
        {
            Console.WriteLine(name); // 输出: Alice Charlie
        }
    }
}

在这个例子中,我们首先使用 Where 方法筛选出了年龄大于25的人,然后使用 Select 方法只选择了这些人的名字。

示例 4:带索引的筛选

有时我们需要根据元素在序列中的索引来筛选数据。这时可以使用第二个重载的 Where 方法,它不仅传递元素本身,还传递该元素在序列中的索引位置。

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

class Program
{
    static void Main()
    {
        List<string> words = new List<string> { "apple", "banana", "cherry", "date", "elderberry" };

        var filteredWords = words.Where((word, index) => word.Length > 5 || index % 2 == 0);

        foreach (var word in filteredWords)
        {
            Console.WriteLine(word); // 输出: apple cherry date elderberry
        }
    }
}

在这个例子中,我们使用了带索引的 Where 方法,筛选出了长度大于5的单词或者索引为偶数的单词。

示例 5:带索引的筛选解析

int[] numbers = { 0, 30, 20, 15, 90, 85, 40, 75 };

IEnumerable<int> query =
    numbers.Where((number, index) => number <= index * 10);

foreach (int number in query)
{
    Console.WriteLine(number);
}
/*
 This code produces the following output:

 0
 20
 15
 40
*/
  • 第一个参数 number表示要测试的元素。 第二个参数表示 中 index元素的从零开始的索引。
  • 过滤过程,根据条件计算:
    • 索引0:0 <= 0×10 → 0(保留)
    • 索引1:30 <= 1×10 → 30>10(舍弃)
    • 索引2:20 <= 2×10 → 20<=20(保留)
    • 索引3:15 <=3×10 → 15<=30(保留)
    • 索引4:90 <=4×10 → 90>40(舍弃)
    • 索引5:85 <=5×10 → 85>50(舍弃)
    • 索引6:40 <=6×10 → 40<=60(保留)
    • 索引7:75 <=7×10 → 75>70(舍弃)
    • 最终输出:0 20 15 40。

示例 6:自定义对象

当我们处理自定义对象时,可以根据对象的属性进行筛选。例如,筛选出所有年龄大于30岁的人。

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

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Charlie", Age = 35 },
            new Person { Name = "David", Age = 20 }
        };

        var filteredPeople = people.Where(p => p.Age > 30);

        foreach (var person in filteredPeople)
        {
            Console.WriteLine($"{person.Name} ({person.Age})"); // 输出: Charlie (35)
        }
    }
}

在这个例子中,我们根据 Person 对象的 Age 属性筛选出了所有年龄大于30岁的人。

4. 注意事项

尽管 Where 方法非常有用,但在实际应用中也有一些需要注意的地方:

  • 延迟执行Where 方法是延迟执行的,这意味着它不会立即对集合进行筛选操作,而是返回一个查询表达式。只有在实际遍历结果集时,才会执行筛选操作。这种设计可以提高性能,特别是在处理大型集合时。
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
        var query = numbers.Where(n => n > 3);

        Console.WriteLine("Before modifying the list:");
        foreach (var num in query)
        {
            Console.WriteLine(num); // 输出: 4 5
        }

        numbers.Add(6);
        Console.WriteLine("After modifying the list:");
        foreach (var num in query)
        {
            Console.WriteLine(num); // 输出: 4 5 6
        }
    }
}

在这个例子中,我们看到即使在第一次遍历之后修改了原始集合,第二次遍历时仍然包含了新添加的元素。

  • 谓词函数的性能:谓词函数的复杂度直接影响到 Where 方法的性能。尽量保持谓词函数简单高效,避免在谓词函数中执行耗时的操作。

  • 不可变性Where 方法不会修改原始集合,而是返回一个新的集合。这意味着原始集合保持不变,新的集合只包含满足条件的元素。

  • 空集合处理: 如果源集合为空,Where 方法将返回一个空的结果集。因此,在使用 Where 方法之前,通常不需要检查集合是否为空。

三、 OfType:类型过滤

1. 什么是 OfType

OfType<T> 方法是 LINQ 提供的一个扩展方法,用于从集合中筛选出可以转换为指定类型的元素。它可以帮助我们在多态集合中提取特定类型的对象,过滤掉无法转换的元素。

2. OfType方法 基本信息

1)OfType

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source);
  • 参数source 表示要筛选的源集合。
  • 返回值:一个包含可以转换为指定类型的元素的 IEnumerable<TResult>

2)工作原理

OfType<T> 方法会遍历集合中的每个元素,并尝试将其转换为目标类型 TResult。如果转换成功,则该元素会被包含在结果集中;如果转换失败(例如元素不是目标类型的实例),则该元素会被忽略。

2)使用场景

  • 多态集合:当集合中包含多种类型的对象时,可以使用 OfType<T> 提取特定类型的对象。
  • 接口和基类:当集合中包含实现某个接口或继承自某个基类的对象时,可以使用 OfType<T> 过滤出特定类型或接口的实例。
  • 类型安全操作:在对集合进行操作之前,确保所有元素都是期望的类型,避免运行时类型转换异常。

3. 使用示例

示例 1:基本用法

假设我们有一个包含不同类型的对象的集合,我们可以使用 OfType<T> 提取出特定类型的对象。

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

class Program
{
    static void Main()
    {
        List<object> mixedList = new List<object>
        {
            1,
            "Hello",
            2.5,
            true,
            "World"
        };

        var strings = mixedList.OfType<string>();

        foreach (var str in strings)
        {
            Console.WriteLine(str); // 输出: Hello World
        }
    }
}

在这个例子中,我们创建了一个包含不同类型对象的列表 mixedList,然后使用 OfType<string>() 提取了所有字符串类型的元素。

示例 2:多态集合

假设我们有一个包含多个派生类对象的集合,可以使用 OfType<T> 提取特定派生类的实例。

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

class Animal { }
class Dog : Animal { }
class Cat : Animal { }

class Program
{
    static void Main()
    {
        List<Animal> animals = new List<Animal>
        {
            new Dog(),
            new Cat(),
            new Dog(),
            new Cat()
        };

        var dogs = animals.OfType<Dog>();

        foreach (var dog in dogs)
        {
            Console.WriteLine("Dog instance found"); // 输出: Dog instance found Dog instance found
        }
    }
}

在这个例子中,我们创建了一个包含 DogCat 对象的集合 animals,然后使用 OfType<Dog>() 提取了所有 Dog 类型的实例。

示例 3:接口集合

假设我们有一个包含实现了某个接口的对象的集合,可以使用 OfType<T> 提取实现该接口的对象。

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

interface IAnimal
{
    void Speak();
}

class Dog : IAnimal
{
    public void Speak() => Console.WriteLine("Woof!");
}

class Cat : IAnimal
{
    public void Speak() => Console.WriteLine("Meow!");
}

class Program
{
    static void Main()
    {
        List<object> mixedList = new List<object>
        {
            new Dog(),
            new Cat(),
            "Hello",
            42
        };

        var animals = mixedList.OfType<IAnimal>();

        foreach (var animal in animals)
        {
            animal.Speak(); // 输出: Woof! Meow!
        }
    }
}

在这个例子中,我们创建了一个包含不同类型的对象的列表 mixedList,然后使用 OfType<IAnimal>() 提取了所有实现了 IAnimal 接口的对象,并调用了它们的 Speak 方法。

示例 4:结合其他 LINQ 方法

OfType<T> 可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 OfType<T> 提取特定类型的对象,然后再使用 SelectWhere 等方法进行进一步处理。

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

class Program
{
    static void Main()
    {
        List<object> mixedList = new List<object>
        {
            1,
            "Hello",
            2.5,
            true,
            "World"
        };

        var upperStrings = mixedList
            .OfType<string>()
            .Select(s => s.ToUpper());

        foreach (var str in upperStrings)
        {
            Console.WriteLine(str); // 输出: HELLO WORLD
        }
    }
}

在这个例子中,我们首先使用 OfType<string>() 提取所有字符串类型的元素,然后使用 Select 方法将这些字符串转换为大写形式。

4. 注意事项

  • 性能考虑:OfType 会遍历整个集合并尝试对每个元素进行类型转换。如果集合非常大,这可能会导致性能问题。因此,在处理大型集合时,应谨慎使用,并根据具体需求选择合适的方法。

  • 类型安全性:虽然 OfType 可以帮助我们过滤出特定类型的元素,但它并不能防止所有类型的错误。例如,如果集合中包含不兼容类型的对象,这些对象会被忽略,但不会引发异常。因此,在使用 OfType 时,仍然需要确保集合中的数据符合预期。

  • Cast<T> 的区别

    • Cast<T>:尝试将集合中的每个元素强制转换为指定类型。如果转换失败,会抛出 InvalidCastException
    • OfType<T>:仅保留可以成功转换为指定类型的元素,忽略无法转换的元素。
    • 因此,OfType<T> 更加灵活和安全,特别是在处理可能包含多种类型对象的集合时。

四、Distinct:去重

1. 什么是 Distinct

Distinct 是 LINQ 提供的一个扩展方法,用于从集合中筛选出唯一的元素,去除重复项。它适用于实现了 IEnumerable 接口的任何类型,包括数组、列表和其他可枚举集合。

2. Distinct 方法基本信息

1)Distinct

Distinct用于从集合中去除重复的元素。

public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source);
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source, IEqualityComparer<TSource> comparer);
  • 参数
    • source:要筛选的源序列。
    • comparer(可选):用于比较元素的 IEqualityComparer<T> 实现。
  • 返回值:一个包含唯一元素的序列。

2) 工作原理

Distinct 方法会遍历集合中的每个元素,并使用默认的或自定义的比较器来判断元素是否已经存在于结果集中。如果元素是唯一的,则将其添加到结果集中;如果元素已经存在,则忽略该元素。

3)使用场景

  • 去除重复数据:当集合中包含重复的数据时,可以使用 Distinct 方法去除这些重复项。
  • 数据清洗:在处理用户输入或其他外部数据源时,去除重复项有助于提高数据质量。
  • 性能优化:在某些高性能应用场景中,去除重复项可以减少不必要的计算和内存占用。

3. 使用示例

示例 1:基本用法

假设我们有一个包含重复数字的列表,我们可以使用 Distinct 方法去除这些重复项。

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

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 2, 3, 4, 4, 5 };

        var distinctNumbers = numbers.Distinct();

        foreach (var num in distinctNumbers)
        {
            Console.WriteLine(num); // 输出: 1 2 3 4 5
        }
    }
}

在这个例子中,我们创建了一个包含重复数字的列表 numbers,然后使用 Distinct 方法去除了重复项。

示例 2:自定义对象去重

当我们处理自定义对象时,默认情况下,Distinct 方法会使用对象的引用进行比较。为了实现基于对象属性的比较,我们需要提供一个自定义的 IEqualityComparer<T> 实现。

定义自定义类

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

自定义比较器

class PersonComparer : IEqualityComparer<Person>
{
    public bool Equals(Person x, Person y)
    {
        if (x == null && y == null) return true;
        if (x == null || y == null) return false;
        return x.Name == y.Name && x.Age == y.Age;
    }

    public int GetHashCode(Person obj)
    {
        if (obj == null) return 0;
        int hashName = obj.Name == null ? 0 : obj.Name.GetHashCode();
        int hashAge = obj.Age.GetHashCode();
        return hashName ^ hashAge;
    }
}

使用自定义比较器

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

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Alice", Age = 30 }, // 重复项
            new Person { Name = "Charlie", Age = 35 }
        };

        var distinctPeople = people.Distinct(new PersonComparer());

        foreach (var person in distinctPeople)
        {
            Console.WriteLine($"{person.Name} ({person.Age})"); // 输出: Alice (30), Bob (25), Charlie (35)
        }
        //简化输出
        Console.WriteLine(string.Join(",",distinctPeople.Select(x=>$"{x.Name} ({x.Age})")));
        
    }
}

在这个例子中,我们定义了一个自定义类 Person 和一个自定义比较器 PersonComparer,然后使用 Distinct 方法去除了重复的 Person 对象。

相反,如果不定义 自定义比较器 PersonComparer,是无法对 自定义 Person对象进行去重的。

示例 3:结合其他 LINQ 方法

Distinct 可以与其他 LINQ 方法结合使用,进一步增强其功能。例如,我们可以先使用 Select 方法提取特定属性,然后再使用 Distinct 方法去除重复项。

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

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 30 },
            new Person { Name = "Bob", Age = 25 },
            new Person { Name = "Alice", Age = 30 }, // 重复项
            new Person { Name = "Charlie", Age = 35 }
        };

        var uniqueNames = people.Select(p => p.Name).Distinct();

        foreach (var name in uniqueNames)
        {
            Console.WriteLine(name); // 输出: Alice, Bob, Charlie
        }
    }
}

在这个例子中,我们首先使用 Select 方法提取了所有人的名字,然后使用 Distinct 方法去除了重复的名字。

示例 4:字符串集合

假设我们有一个包含重复字符串的集合,我们可以使用 Distinct 方法去除这些重复项。

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

class Program
{
    static void Main()
    {
        List<string> words = new List<string> { "apple", "banana", "apple", "orange", "banana" };

        var distinctWords = words.Distinct();

        foreach (var word in distinctWords)
        {
            Console.WriteLine(word); // 输出: apple, banana, orange
        }
    }
}

在这个例子中,我们创建了一个包含重复字符串的列表 words,然后使用 Distinct 方法去除了重复项。

4. 注意事项

尽管 Distinct 方法非常有用,但在实际应用中也有一些需要注意的地方:

  • 性能考虑Distinct 方法会遍历整个集合并存储已经遇到的元素。对于大型集合,这可能会导致性能问题。因此,在处理大型集合时,应谨慎使用,并根据具体需求选择合适的方法。
  • 默认比较器: 默认情况下,Distinct 方法使用对象的 EqualsGetHashCode 方法进行比较。对于自定义对象,如果没有重写这些方法,Distinct 可能无法正确识别重复项。
  • 自定义比较器: 如果需要基于对象的某个属性进行比较,必须提供一个自定义的 IEqualityComparer<T> 实现。否则,Distinct 方法将无法正确识别重复项。
  • 不可变性Distinct 方法不会修改原始集合,而是返回一个新的集合。这意味着原始集合保持不变,新的集合只包含唯一的元素。

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
微软官方文档 Enumerable

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

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

相关文章

【Linux基础】Linux下的C编程指南

目录 一、前言 二、Vim的使用 2.1 普通模式 2.2 插入模式 2.3 命令行模式 2.4 可视模式 三、GCC编译器 3.1 预处理阶段 3.2 编译阶段 3.3 汇编阶段 3.4 链接阶段 3.5 静态库和动态库 四、Gdb调试器 五、总结 一、前言 在Linux环境下使用C语言进行编程是一项基础且…

浅谈HTTP及HTTPS协议

1.什么是HTTP&#xff1f; HTTP全称是超文本传输协议&#xff0c;是一种基于TCP协议的应用非常广泛的应用层协议。 1.1常见应用场景 一.浏览器与服务器之间的交互。 二.手机和服务器之间通信。 三。多个服务器之间的通信。 2.HTTP请求详解 2.1请求报文格式 我们首先看一下…

Pytest自定义测试用例执行顺序

文章目录 1.前言2.pytest默认执行顺序3.pytest自定义执行顺序 1.前言 在pytest中&#xff0c;我们可能需要自定义测试用例的执行顺序&#xff0c;例如登陆前需要先注册&#xff0c;这个时候就需要先执行注册的测试用例再执行登录的测试用例。 本文主要讲解pytest的默认执行顺序…

人大金仓KCA | 用户与角色

人大金仓KCA | 用户与角色 一、知识预备1. 用户和角色 二、具体实施1. 用户管理-命令行1.1 创建和修改用户1.2 修改用户密码1.3 修改用户的并发连接数1.4 修改用户的密码有效期 2.用户管理-EasyKStudio2.1 创建和修改用户2.2 修改用户密码2.3 修改用户的并发连接数2.4 修改用户…

【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖&#xff0c;基本上绕不开一个架构“Medallion”&#xff0c; 它使得数据管理更为简单有效。ADB 通过…

智能证件照处理器(深度学习)

功能说明:支持常见证件照尺寸(一寸、二寸、护照等) 智能背景去除(使用深度学习模型)自定义背景颜色选择自动调整尺寸并保持比例实时预览处理效果注意:整合rembg进行抠图,使用Pillow处理图像缩放和背景替换,定义常见证件照尺寸,并提供用户交互选项。首次运行时会自动下…

C++-第十三章:红黑树

目录 第一节&#xff1a;红黑树的特征 第二节&#xff1a;实现思路 2-1.插入 2-1-1.unc为红 2-1-2.cur为par的左子树&#xff0c;且par为gra的左子树(cur在最左边) 2-1-2-1.unc不存在 2-1-2-2.unc为黑 2-1-3.cur为par的右子树&#xff0c;且par为gra的右子树(cur在最右侧) 2-…

推荐3个背景渐变色的wordpress主题

干净、清爽、背景渐变色的wordpress企业主题 ​ 服务类公司wordpress企业主题https://www.jianzhanpress.com/?p8255 红色大气的wordpress企业主题&#xff0c;适合服务行业的公司搭建企业官方网站使用。 ​ wordpress询盘型独立站主题https://www.jianzhanpress.com/?p8258…

Scrapy:隧道代理中移除 Proxy-Authorization 的原理解析

隧道代理中移除 Proxy-Authorization 的原理解析 背景 在 Scrapy 的 HTTP 下载处理中&#xff0c;当使用隧道代理&#xff08;TunnelingAgent&#xff09;时&#xff0c;会移除请求头中的 Proxy-Authorization。这个操作看似简单&#xff0c;但背后有着重要的安全考虑和技术原…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

Fiddler 的安装与使用

目录 1、Fiddler 的安装2、Fiddler 的使用 1、Fiddler 的安装 通过Fiddler 官网进行下载&#xff08;下载免费的经典版本&#xff09;&#xff0c;填写用途、邮箱、国家信息即可开始下载。 Fiddler 官网下载链接 双击安装包即可进行安装&#xff0c;显示以下界面说明安装成功。…

Hadoop架构详解

Hadoop 是一个开源的分布式计算系统&#xff0c;用于存储和处理大规模数据集。Hadoop 主要由HDFS&#xff08;Hadoop Distributed File System&#xff09;、MapReduce、Yarn&#xff08;Jobtracker&#xff0c;TaskTracker&#xff09;三大核心组件组成。其中HDFS是分布式文件…

清华大学DeepSeek文档下载,清华大学deepseek下载(完成版下载)

文章目录 前言一、清华大学DeepSeek使用手册下载二、清华大学DeepSeek使用手册思维导图 前言 这是一篇关于清华大学deepseek使用手册pdf的介绍性文章&#xff0c;主要介绍了DeepSeek的定义、功能、使用方法以及如何通过提示语设计优化AI性能。以下是对这些核心内容的简要概述&…

Hadoop第2课(伪分布式集群的搭建)

jdk和hadoop安装包&#xff1a; hadoop-2.9.2.t......等2个文件官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 1、用XFTP发送hadoop安装包和jdk到/home/hadoop/目录下&#xff08;hadoop用户的主目录&#xff09; 2、解压jdk安装包到~目录 卸载jdk的命令&#xff1a;r…

使用Crawlee可破题js渲染采集数据

使用 Crawlee 实现自动化爬虫流程 1. Crawlee 简介 Crawlee 是一个强大的爬虫框架&#xff0c;用于快速构建和维护可靠的爬虫。它支持多种爬虫类型&#xff0c;包括基于 Cheerio 和 Playwright 的爬虫&#xff0c;能够高效处理静态和动态网页。 2. 项目目标 通过自动化脚本实…

Fiddler在Windows下抓包Https

文章目录 1.Fiddler Classic 配置2.配置浏览器代理自动代理手动配置浏览器代理 3.抓取移动端 HTTPS 流量&#xff08;可选&#xff09;解决抓取 HTTPS 失败问题1.Fiddler证书过期了 默认情况下&#xff0c;Fiddler 无法直接解密 HTTPS 流量。需要开启 HTTPS 解密&#xff1a; 1…

Java语法基础知识点1

目录 一、数组 1.1数组的初始化&#xff1a; 1.2数组的遍历方法&#xff1a; 1.3数组的常见使用方法&#xff1a; 二、类和对象 2.1构造方法&#xff1a; 2.2this关键字: 三、封装 3.1访问限定符&#xff1a; 3.2static关键字&#xff1a; 3.3代码块&#xff1a; 一…

【新手入门】SQL注入之盲注

一、引言 在我们的注入语句被带入数据库查询但却什么都没有返回的情况我们该怎么办? 例如应用程序返回到一个"通用的"的页面&#xff0c;或者重定向一个通用页面(可能为网站首页)。这时&#xff0c;我们之前学习的SQL注入的办法就无法使用了。这种情况我们称之为无…

python-leetcode-分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution:def canPartition(self, nums: List[int]) -> bool:total sum(nums)if total % 2 ! 0:return Falsetarget total // 2dp [False] * (target 1)dp[0] Truefor num in nums:for j in range(tar…

趣讲TCP三次握手

一、TCP三次握手简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在TCP连接中&#xff0c;只有两方进行通信&#xff0c;它使用校验和、确认和重传机制来保证数据的可靠传输。…