C# 求精简用一行代码完成的多项判断 重复赋值
C# 求精简用一行代码完成的多项判断 重复赋值
哈哈,说实话,个人看着这么长的三元操作也麻烦,但是我也只想到了这样三元判断句中执行方法体能够写到一行,追求的终极目的是,用一行实现这个过程,而且简单,由于篇幅,我就不截图我其实是放在一行上的
讨论的重点是怎么做的更极致,而不是这样搞规范不规范,求更有创意的写法。。。
。。 。。华丽丽的分割线。。 。。
var turecolor = colorJToken.OfType<JProperty>().Sum(d => (int)d.Value << "bgra".IndexOf(d.Name) * 8).ToString("X8");
如果是处理颜色,相信 Choo给出的写法想必是极好的,那么如果扩展成普通的用法呢?
。。 。。华丽丽的分割线。。 。。
刚说不实用,先不讨论是不是实用,也不管可读性,单纯的想把代码写在一行上,而且写的少,总结一下,主要内容在这,我想到的写到一行的方法是在三元判断句中执行方法体
bool b = 1 == 1 ? ((Func<bool>)(() => true)).Invoke() : ((Func<bool>)(() => false)).Invoke();
能不能继续精简这样一句话?
鬼柒 在评论中提出了直接纯赋值的写法,嗯,这个在不需要做额外判断的时候好了太多,那么现在的场景是,需要进行判断赋值的话,怎么样写呢?
( Name == "a" ? alph = (Byte)Value : Name == "r" ? red = (Byte)Value : Name == "g" ? green = (Byte)Value : Name == "b" ? blue = (Byte)Value).ToString(0);
。。 。。华丽丽的分割线。。 。。
其中 color仅仅为一个普通的JToken类型,需要精简的是,对于循环重复赋值上,能不能有更简单而且简洁的写法。。。
需求是,用一行完成,且必须有能够执行多判断的地方


Byte red = 0, green = 0, blue = 0, alph = 255;
JToken colorJToken = CurrentVersion < ColorVersion ? color.FirstOrDefault() : color;
if (colorJToken != null)
{
foreach (var item in colorJToken)
{
var colorJProperty = item as JProperty;
if (colorJProperty != null && colorJProperty.Value != null)
{
//以下求精简
(colorJProperty.Name == "a" ? ((Func<bool>)(() => colorJProperty.Value is Byte && (alph = (Byte)colorJProperty.Value).Equals(alph))).Invoke() :
(colorJProperty.Name == "r" ? ((Func<bool>)(() => (red = (Byte)colorJProperty.Value).Equals(red))).Invoke() :
(colorJProperty.Name == "g" ? ((Func<bool>)(() => (green = (Byte)colorJProperty.Value).Equals(green))).Invoke() :
(colorJProperty.Name == "b" ? ((Func<bool>)(() => (blue = (Byte)colorJProperty.Value).Equals(blue))).Invoke() :
((Func<bool>)(() => false)).Invoke())))).ToString();
}
}
}

1.高效的数据写入(put)

“锁分离” 技术
2.巧妙的数据移除(remove)


|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
void removeEntry(HashEntry entry, int hash) {
int c = count - 1; AtomicReferenceArray<HashEntry> tab = table; int index = hash & (tab.length() - 1); HashEntry first = tab.get(index); for (HashEntry e = first; e != null; e = e.next) { HashEntry removeEntryFromChain(HashEntry first, HashEntry entry) { HashEntry copyEntry(HashEntry original, HashEntry newNext) { |
3.按需扩容机制(rehash)
|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
void rehash() {
/** * .... 部分代码省略 */ for (int oldIndex = 0; oldIndex < oldCapacity; ++oldIndex) { HashEntry head = oldTable.get(oldIndex); if (head != null) { HashEntry next = head.next; int headIndex = head.getHash() & newMask; // next为空代表这个链表就只有一个元素,直接把这个元素设置到新数组中 // 在这之前的元素下标有可能一样,也有可能不一样,所以把前面的元素重新复制一遍放到新数组中 |
时间轴
删除指定元素的先进先出队列AccessQueue


|
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
static final class AccessQueue extends AbstractQueue<ReferenceEntry> {
// head代码省略 final ReferenceEntry head = XXX; // 其他部分代码省略 @Override // 添加到链表tail return true; @Override @Override return next != NullEntry.INSTANCE; // 将previous与next链接起来 // 将nulled的previousAccess和nextAccess都设为nullEntry,方便GC回收nulled |
何时进行过期移除?
|
1
2 3 4 5 6 7 |
void postReadCleanup() {
// 作为位操作的mask(DRAIN_THRESHOLD),必须是(2^n)-1,也就是1111的二进制格式 if ((readCount.incrementAndGet() & DRAIN_THRESHOLD) == 0) { // 代表每2^n执行一次 cleanUp(); } } |
|
1
2 3 4 5 6 7 8 9 10 11 |
void expireEntries(long now) {
drainRecencyQueue(); ReferenceEntry e; |
5.个数统计(size)
总结:
C# 求精简用一行代码完成的多项判断 重复赋值的更多相关文章
- 只要一行代码求一串字符中某字符(串)出现次数,c#
这里只要一行代码就行. static void Main(string[] args) { string str = "qwerwqr;sfdsfds;fdfdsf;dfsdfsdf;dsf ...
- python基础知识-8-三元和一行代码(推导式)
python其他知识目录 1.三元运算(三目运算) 三元运算符就是在赋值变量的时候,可以直接加判断,然后赋值格式:[on_true] if [expression] else [on_false]re ...
- 一行代码调用实现带字段选取+条件判断+排序+分页功能的增强ORM框架
问题:3行代码 PDF.NET是一个开源的数据开发框架,它的特点是简单.轻量.快速,易上手,而且是一个注释完善的国产开发框架,受到不少朋友的欢迎,也在我们公司的项目中多次使用.但是,PDF.NET比起 ...
- Sagit.Framework For IOS 开发框架入门开发教程2:一行代码实现引导页
前言: 开篇比较简单:Sagit.Framework For IOS 开发框架入门开发教程1:框架下载与环境配置 第二篇教程之前写了一半,感觉不太好写,而且内容单纯介绍API,要说的很多,又枯燥乏味. ...
- python一行代码就能搞定的事情!
打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...
- Asp.Net Core 轻松学-一行代码搞定文件上传 JSONHelper
Asp.Net Core 轻松学-一行代码搞定文件上传 前言 在 Web 应用程序开发过程中,总是无法避免涉及到文件上传,这次我们来聊一聊怎么去实现一个简单方便可复用文件上传功能:通过创建 ...
- python实战===一行代码就能搞定的事情!
打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...
- [WCF]缺少一行代码引发的血案
这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
随机推荐
- node.js高效操作mongodb
node.js高效操作mongodb Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为Jav ...
- 多维算法思考(三):AB组合问题
多维算法思考(三):AB组合问题 题目:x个A,y个B可以组合成多少个不同排列的问题. 首先,我们用数学的方式思考,这个问题属于<组合数学>的问题,我们的第一种方法可以用组合思路来求解. ...
- iOS10收集IDFA,植入第三方广告[终结]--ADMob
[PS: 前段时间,公司做ASO推广,需要在应用中收集IDFA值,跟广告平台做交互!于是有了这个需求--] 1.首先,考虑了一下情况(自己懒 -_-#),就直接在首页上写了一个Banner,循环加载广 ...
- Java数据结构与算法(4) - ch04队列(Queue和PriorityQ)
队列: 先进先出(FIFO). 优先级队列: 在优先级队列中,数据项按照关键字的值有序,关键字最小的数据项总在对头,数据项插入的时候会按照顺序插入到合适的位置以确保队列的顺序,从后往前将小于插入项的数 ...
- javascript正则表达式小数类型
假设你要阅读并了解什么,能阅读.假设只需要结果,直接跳转到这篇文章的结尾. 有使用前需求javascript正则表达式匹配小数类型,后来,他们已经写是不完全正确的识别. 后来在网上找了很多,甚至包含一 ...
- 【百度地图API1.1】修改文本标注的样式
原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...
- ASP.NET vNext (一)- 基本概念和环境配置
ASP.NET vNext (一)- 基本概念和环境配置 转发:微软MVP 卢建晖 的文章,希望对大家有帮助. 编者语:时代在变,在csdn开博一年就发了那么的两篇文章,无论是什么原因都觉得有愧了.但 ...
- ASP.NET 5是如何通过XRE实现跨平台的
挡不住的好奇心:ASP.NET 5是如何通过XRE实现跨平台的 .NET程序员也有自己的幸福,.NET的跨平台是一种幸福,.NET的开源也是一种幸福,而更幸福的是可以通过开源的.NET了解.NET ...
- Mvc 6 中创建 Web Api
如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管 微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我 ...
- oracle 非数字型转数字型
原文:oracle 非数字型转数字型 oracle中如果一个字段内容不全是数字型 可以通过以下方式过滤 to_number(substr(translate(a.vital_signs_cvalues ...