【写法】C# 如何删除数组内的某个值、一组值

===============================================

2020/2/29_第1次修改                       ccb_warlock

===============================================

最近优化了一个权限校验的功能,之前每次其他系统在获取各自系统的权限配置时,sso都去找到本地对应的权限文件读取解析一次。

这种设计虽然可以实现功能,但是这种反复去读取的策略并不经济,尤其在高并发的情况下更可能会成为性能瓶颈。

于是我对这块业务进行了优化,而在优化的过程中针对如何去除数组内的某些参数试验了一些写法,下面记录我认为比较优雅的写法。



首先讲下场景,设计多系统的权限统一由sso控制,那么每次用户登录其他系统后需要向sso请求“用户在该系统已有的权限”或“该用户当前是否拥有该功能的操作权限”。

那么sso需要在权限验证通过后再去获取该用户当前的权限信息并返回,于是在权限校验的service中,我在构造器里根据已有的系统类型先获取一次对应完整的权限树,后面如果发现有缺失再尝试读取文件,不缺失则直接读缓存配置。

已有的系统通过枚举来记录,假设定义如下:

public enum EnumSystemType
{
    NoMenu = 0, // 不需要权限树的系统或程序
    App01 = 1,
    App02 = 2,
    ......
}

每个系统的权限配置保存在各自的文件中,例如App01完整的权限树保存在App01.json中。

接着就是根据已有的系统去获取每个文件的内容并解析成权限树缓存下来。而在获取文件内容时,不需要获取权限的枚举(NoMenu)需要跳过找文件读取的逻辑。这里我借助的是linq的功能来实现过滤该枚举值的逻辑。

using System.Linq;

private Dictionary<string, List<PermissionNode>> GetPermissions()
{
    //todo

    foreach (var fileName in Enum.GetNames(typeof(EnumSystemType))
       .Where(s => s != nameof(EnumSystemType.NoMenu))
       .ToArray())
    {
        //todo
    }

    //todo
}

PS. Enum.GetNames的返回值是字符串数组。

单个参数的过滤通过where很容易就实现了,我突然想到一个问题,如何实现批量过滤一些枚举值呢?

查了查资料,linq果然有解决方案,就是通过“Except”。

接着我还是以上面的例子来试验,假如我希望构造器读取时跳过NoMenu和App01,可以这么写:

using System.Linq;

private Dictionary<string, List<PermissionNode>> GetPermissions()
{
    //todo

    var exceptPermissions = new []
    {
        nameof(EnumSystemType.NoMenu),
        nameof(EnumSystemType.App01),
    };

    foreach (var fileName in Enum.GetNames(typeof(EnumSystemType))
        .Except(exceptPermissions)
        .ToArray())
    {
        //todo
    }

    //todo
}

总结:

1. 如何在一个数组中移除某个值的写法:linq的where

2. 如何在一个数组中移除多个值的写法:linq的except

原文地址:https://www.cnblogs.com/straycats/p/12387376.html

时间: 2024-08-11 01:01:25

【写法】C# 如何删除数组内的某个值、一组值的相关文章

Array.prototype.removeBeginWithVal(删除数组内以某值开头的字符串对象)

Array扩展方法: 1 //author: Kenmu 2 //created time: 2015-03-16 3 //function: 删除数组内以某值开头的字符串对象 4 Array.prototype.removeBeginWithVal = function (val) { 5 for(var i=0, len = this.length; i < len; i++) { 6 if(this[i].indexOf(val) != -1) { 7 this.splice(i, 1);

使用sort加个简单的算法,不循环整个数组而删除数组内的某些元素。

昨天遇到一个这样的场景: 有一个不分页的商品列表,里面可能有上千条数据(而且可能是静态数据)甚至更多,这里有个删除功能,需要我们删除其中的一些商品. 这时我的第一反应就是,数据过多不能循环整个数组,只有获取到它们的索引,然后循环得到的索引,使用数组的splice()方法对它进行删除.并且我这样做了,但是发现了一个致命的bug. bug的原因是这样的: 我先得到了一组索引(就是我所需要删除的商品的索引),然后循环了这组索引,在每次循环的时候我执行了splie()方法,但是由于splice方法执行后

删除数组中的元素(链表)

[问题描述] 给定N个整数,将这些整数中与M相等的删除 假定给出的整数序列为:1,3,3,0,-3,5,6,8,3,10,22,-1,3,5,11,20,100,3,9,3 应该将其放在一个链表中,链表长度为20 要删除的数是3,删除以后,链表中只剩14个元素:1 0 -3 5 6 8 10 22 -1 5 11 20 100 9 [输入] 包含3行:第一行是一个整数n(1 <= n <= 200000),代表数组中元素的个数.第二行包含n个整数,代表数组中的n个元素.每个整数之间用空格分隔:

PHP方便快捷的将二维数组中元素的某一列值抽离出来作为此二维数组内元素的key

得益于PHP的强大的内置数组函数array_column();array_combine(); 举个小栗子: <?php // 先查询出用户的基本信息 $userArray = [['id' => 'zs', 'name' => '张三'], ['id' => 'ls', 'name' => '李四'], ['id' => 'wr', 'name' => '王二']]; // 将二维数组内某具体列的值组成一个新用户数组 $userArrayNew = array_

数组常用的方法和返回值

push:向数组的末尾增加一项 返回值是数组的新长度unshift:向数组开头增加一项 返回值是数组的新长度pop:删除数组的末尾项 返回值是删除的数组项shift:删除数组开头项 返回被删除的开头项目splice:删除数组中的任意项 返回值是被删除的数组项slice:复制数组 返回值是复制到的新数组 写上数值之后 不包含被复制的最后一项 拼接:concat:把一个数组和另一个数组拼接在一起 返回拼接好的数组 join:把数组中的每一项 按照指定的分隔符拼接成字符串 排序:reverse:倒序数

数组的创建/查找数组里面的内容/添加数组中元素/使用指定的字符串把数组链接起来/判断数组内是否有指定的数组元素/四种遍历进行输出数组中的元素有哪些

#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //创建数组 //1.快速创建数组@[] NSArray*[email protected][@"month",@"tue",@" wed",@"fir"]; //2,创建空的数组 NSArray*arr=[[NSArray a

js删除数组中某一项或几项的几种方法

1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空 如:arr = ['a','b','c','d'] 删除 ----  item不设置 arr.splice(1,1)   //['a','c','d']         删除起始下

记录:js删除数组中某一项或几项的几种方法

1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空 如:arr = ['a','b','c','d'] 删除 ----  item不设置 arr.splice(1,1)   //['a','c','d']         删除起始下

记录:js删除数组中某一项或几项的几种方法(转)

1:js中的splice方法 splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 index:数组开始下标        len: 替换/删除的长度       item:替换的值,删除操作的话 item为空 如:arr = ['a','b','c','d'] 删除 ----  item不设置 arr.splice(1,1)   //['a','c','d']         删除起始下