首页 > 编程语言 >《Effective C#》系列之(五)——优化集合的使用

《Effective C#》系列之(五)——优化集合的使用

时间:2023-04-27 16:15:21浏览次数:31  
标签:Effective C# List list var 泛型 集合 new

一、优化集合的使用
在《Effective C#》这本书中,优化集合的使用是其中一章的内容。以下是该章节的一些核心建议,以及使用C#代码示例说明:

  1. 使用泛型集合:泛型集合可以避免装箱和拆箱操作,提高代码的性能和可读性。例如:

    // 使用泛型List集合
    var list = new List<int>();
    list.Add(1);
    list.Add(2);
    list.Add(3);
    Console.WriteLine(list.Count); // 输出 3
    
  2. 使用集合初始化器:集合初始化器可以方便地初始化集合对象,提高代码的可读性。例如:

    // 使用集合初始化器初始化List集合
    var list = new List<int> { 1, 2, 3 };
    Console.WriteLine(list.Count); // 输出 3
    
    // 使用集合初始化器初始化Dictionary集合
    var dict = new Dictionary<string, int>
    {
        { "Tom", 20 },
        { "Jerry", 18 },
        { "Alice", 22 }
    };
    Console.WriteLine(dict["Tom"]); // 输出 20
    
  3. 使用LINQ查询:LINQ查询可以方便地对集合进行过滤、排序、分组等操作,提高代码的可读性和灵活性。例如:

    // 使用LINQ查询过滤List集合
    var list = new List<int> { 1, 2, 3 };
    var filteredList = list.Where(x => x > 1);
    Console.WriteLine(filteredList.Count()); // 输出 2
    
    // 使用LINQ查询对Dictionary集合进行分组
    var dict = new Dictionary<string, int>
    {
        { "Tom", 20 },
        { "Jerry", 18 },
        { "Alice", 22 }
    };
    var groupedDict = dict.GroupBy(x => x.Value);
    foreach (var group in groupedDict)
    {
        Console.WriteLine($"Age: {group.Key}");
        foreach (var item in group)
        {
            Console.WriteLine($"Name: {item.Key}");
        }
    }
    
  4. 使用并发集合:在多线程环境下使用集合时,需要考虑线程安全性,可以使用并发集合来解决。例如:

    // 使用并发字典
    var dict = new ConcurrentDictionary<string, int>();
    dict.TryAdd("Tom", 20);
    dict.TryAdd("Jerry", 18);
    dict.TryAdd("Alice", 22);
    Console.WriteLine(dict["Tom"]); // 输出 20
    
  5. 避免对集合进行不必要的操作:对集合进行频繁的添加、删除等操作会影响代码的性能,应该避免这种情况。例如:

    // 避免对List集合进行频繁的添加操作
    var list = new List<int>();
    for (int i = 0; i < 100000; i++)
    {
        list.Add(i);
    }
    
    // 避免对HashSet集合进行频繁的删除操作
    var set = new HashSet<int>(Enumerable.Range(0, 100000));
    for (int i = 0; i < 100000; i++)
    {
        set.Remove(i);
    }
    

总之,以上这些建议都可以帮助程序员优化集合的使用,提高代码的性能和可读性。

二、C#集合的常用操作

三、C#集合操作常见面试题

1、关于泛型集合
以下是一道可能较难的C#泛型面试题:

假设有一个泛型类MyList<T>,它实现了一个Add方法,用于向列表中添加元素。现在需要你实现一个新的方法GetRandom,该方法返回列表中的一个随机元素。请你完成这个方法的实现,并说明你的思路。

提示:你可以使用System.Random类来生成随机数。

解答:

这道题的难点在于如何在泛型类中处理随机元素。以下是一种可能的实现方式:

public class MyList<T>
{
    private List<T> items = new List<T>();
    private Random random = new Random();

    public void Add(T item)
    {
        items.Add(item);
    }

    public T GetRandom()
    {
        if (items.Count == 0)
        {
            throw new InvalidOperationException("The list is empty.");
        }

        int index = random.Next(items.Count);
        return items[index];
    }
}

在这个实现中,我们使用了System.Random类来生成随机数。在GetRandom方法中,我们先检查列表是否为空,如果为空则抛出异常。然后我们生成一个随机索引,使用该索引从列表中获取一个随机元素并返回。

需要注意的是,由于MyList<T>是一个泛型类,所以我们需要在类定义时声明一个类型参数T。我们使用List<T>来存储列表中的元素,这里的T与类定义中的T相同。我们还创建了一个Random实例来生成随机数,这个实例可以在整个类中共享。

假设你有一个泛型方法,它接受两个参数:一个是泛型列表,另一个是一个委托,该委托接受一个泛型元素并返回一个布尔值。该方法的目标是返回列表中第一个满足委托条件的元素。请编写该泛型方法的代码。

提示:可以使用foreach循环和委托的Invoke方法来实现该方法。请用C#解答
下面是该泛型方法的代码:

public static T FindFirst<T>(List<T> list, Func<T, bool> predicate)
{
    foreach (T item in list)
    {
        if (predicate.Invoke(item))
        {
            return item;
        }
    }
    return default(T);
}

该方法的参数包括一个泛型列表和一个委托,委托的类型为Func<T, bool>,其中T是泛型元素类型,bool表示返回值类型为布尔值。该方法使用foreach循环遍历列表中的每个元素,然后调用委托的Invoke方法来检查该元素是否满足条件。如果找到了满足条件的元素,则返回该元素;否则返回默认值。

标签:Effective,C#,List,list,var,泛型,集合,new
From: https://www.cnblogs.com/DinAction/p/17359205.html

相关文章

  • ansible推送文件到目标主机时报错 UNREACHABLE! | Permission denied (publickey,gssa
    问题现象:[root@linlin]#ansibleall-mcopy-a'src=/etc/ansible/lin/test.txtdest=/home/'192.168.12.203|UNREACHABLE!=>{"changed":false,"msg":"Failedtoconnecttothehostviassh:[email protected]:Pe......
  • C++ inline
    在C++中,inline关键字用于建议编译器将函数内联到调用它的地方。内联函数是一种优化技术,可以减少函数调用的开销。当一个函数被声明为内联时,编译器会尝试将函数的代码直接嵌入到每个调用该函数的地方,从而避免了函数调用时产生的额外开销,如保存寄存器、设置栈帧等。需要注意的是,inl......
  • Day 27 27.1 JS进阶-Function对象之prototype对象
    JS-Function对象之prorotype原型对象案例1://创建方式1varfoo=newFunction("console.log('helloworld!')")foo()//创建方式2functionPerson(){console.log("helloperson")}varp1=Person()console.log(p1)varp2=newPers......
  • [未解决] Internal server error: loadModule is not a function
    [vite]Internalservererror:loadModuleisnotafunctionPlugin:commonjsFile:E:/project/xxxx/knockout-es5/knockout-es5.min.jsatanalyzeRequiredModule(E:\project\xxxx\node_modules\@rollup\plugin-commonjs\dist\cjs\index.js:680:13)......
  • 本地图文直接复制到dedecms编辑器中
    ​ 图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,找到UM.plugins['autoupload'],然后找到autoUploadHandler方法,注释掉其中的代码。加入下面的代码://判断剪......
  • 关于el-checkbox-group 报错 length 未定义
     问题原因:页面在初始化的时候el-checkbox-group的v-model要绑定一个数组,但是我的在生命周期的created中才为其绑定数据,造成再渲染dom时绑定数据类型不对而报错解决办法:1.在视图渲染之前给该值赋值为空数组 解决办法:2在data中定义的数据初始化一个数组推荐使用方法2,方法1......
  • MFC-CListCtrl-SetExtendedStyle设置扩展风格
       mylist.SetExtendedStyle(LVS_SHOWSELALWAYS|LVS_EX_CHECKBOXES|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);//设置扩展风格风格看:https://www.cnblogs.com/liming19680104/p/17358671.html   ......
  • selenium笔记之PC浏览器仿真移动端
    本来写的UI走查的代码主要场景是web浏览器,少量h5页面校验不值得大费周章用真机去跑背景:首先尝试了移动端真机巡检,但是不同机型,需要调试出合适的appPackage以及其它参数上一段代码:publicAndroidDrivergetWebDriverForAPP(){AndroidDriverappDriver=null;......
  • a little schemer chapter 9 Y组合算子
    内容参照相关阅读推荐 首先是递归获得阶乘的例子(definef(lambda(x)(cond((=x1)1)(else(*x(f(-x1)))))))对应的lambda(f):(lambda(f)(lambda(x)(cond((=x1)1)(else(*x(f(-x1)))))))......
  • 还不知道怎么 Mock ,用这 6款工具!
    以下是几个常用的国外可以mock测试的工具,供参考:MockServer:MockServer是一个开源的APImock测试工具,提供了强大的模拟服务器和mock服务功能。MockServer支持多种语言和格式,包括Java、.NET、REST、SOAP等。WireMock:WireMock是一个轻量级的HTTPmock测试工具,可以......