IE盒子

搜索
查看: 193|回复: 20

大型引战现场(不)易语言与C# 从入门到入土

[复制链接]

4

主题

14

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2023-3-20 18:36:52 | 显示全部楼层 |阅读模式
是这样的,最近很多人跟我说:“易语言因为它内容更少,所以做项目时候会更简单”,然后我的看法是“功能越多的东西,做东西会越简单”。
双方争执不下,于是嘛,打算大概搞几个小案例出来看看,实现同样的功能(先不谈性能),双方写起来分别是怎样的体验。

环境、范围等

易语言使用官网原生版本(5.8)。使用自带IDE。
C#使用.Net Core 3.1, 使用Microsoft第一方.Net基础库。使用第一方IDE Visual Studio.

为了尽可能公平,所选择的案例可是尽可能单纯体现语法设计本身的东西,(不然直接掏出个asp core或者ef core啥的就太欺负人了,把.NET基金会搬出来那就不用玩了)
好的,我们来看内容

两数之和

如图



因为易语言官方库没有哈希表功能,所以,直接遍历。
C#写法(其实就是官方解题案例里的写法):


public class Solution
{
    public int[] TwoSum(int[] nums, int target)
    {
        for (int i = 0; i < nums.Length; i++)
        {
            for(int j = i + 1; j < nums.Length; j++)
            {
                if(nums[j] == target - nums)
                {
                    return new int[2] { i, j };
                }
            }
        }
        return default;
    }
}
我们再来看看易语言实现:
首先,易语言的返回值无法定义数组,所以我们稍微封装一层


(ps:这个表叫“自定义数据结构”,可以粗略的理解为一个原始的struct,然后这个作用域是全局的)
.版本 2

.数据类型 Array_Int, 公开
    .成员 value, 整数型, , "1"然后函数本体实现
.版本 2

.子程序 TwoSun, Array_Int, , 易语言自身没有数组返回值,使用“自定义数据类型实现
.参数 nums, 整数型, 数组
.参数 target, 整数型
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 result, Array_Int

i = 1
j = 1
删除成员 (result.value, 1, 1)  ' “自定义数据类型”不能定义空数组,所以数组默认会有一个长度
.计次循环首 (取数组成员数 (nums), i)
    j = i + 1
    .判断循环首 (j ≤ 取数组成员数 (nums))  ' 数组下标从1开始

        .如果真 (nums [j] = target - nums )
            加入成员 (result.value, i)
            加入成员 (result.value, j)

            返回 (result)
        .如果真结束
        j = j + 1  ' 没有 "j++"这类写法
    .判断循环尾 ()
.计次循环尾 ()
返回 (result)


在代码中,由于易语言的迭代器功能无法实现自定义初始值,如C#那样for循环的j = i +1, 所以这里使用了"while"的方式实现。
所有的变量写在表里的时候就已经被初始赋值了,所以不需要判空。

<hr/>然后我们再挑一个简单题看一下:
有效括号




然后,我们来看C#实现


using System.Collections.Generic;
public class Solution
{
    public bool IsValid(string s)
    {
        Dictionary<char, char> map = new Dictionary<char, char>() { { ']', '[' }, { ')', '(' }, { '}', '{' } };
        Stack<char> stack = new Stack<char>(); //使用Stack或者hashSet或者List<T>之类的各种玩意都行,玩法差不多

        foreach(char item in s) //字符串通过迭代器可以直接从string获得char
        {
            if (map.ContainsKey(item))
            {   //走到这儿的都是右半个括号
                if (stack.Count == 0)
                    return false;
                else
                {
                    var element = stack.Pop();
                    if (element != map[item])
                        return false;
                }
            }
            else
                stack.Push(item);  //这边都是是左半个括号,直接入栈
        }
        return stack.Count == 0;
    }
}

然后来看易语言实现:


.版本 2

.子程序 IsValid, 逻辑型
.参数 s, 文本型
.局部变量 stack, 文本型, , "0", '易语言没有Stack,所以这里用一个数组代替
.局部变量 i, 整数型
.局部变量 item, 文本型, , , '不分字符和字符串
.局部变量 element, 文本型


.计次循环首 (取文本长度 (s), i)
    ' 这种循环用法遇到中文字符就炸了,所以得确保自己知道将会得到的字符串是啥玩意
    item = 取文本中间 (s, i, 1)
    .如果 (item = “]” 或 item = “)” 或 item = “}”)
        .如果 (取数组成员数 (stack) = 0)
            返回 (假)
        .否则
            element = stack [取数组成员数 (stack)]
            删除成员 (stack, 取数组成员数 (stack), 1)
            .如果真 (element = “(” 且 item ≠ “)”)
                返回 (假)
            .如果真结束
            .如果真 (element = “[” 且 item ≠ “]”)
                返回 (假)
            .如果真结束
            .如果真 (element = “{” 且 item ≠ “}”)
                返回 (假)
            .如果真结束

        .如果结束


    .否则
        加入成员 (stack, item)
    .如果结束


.计次循环尾 ()

返回 (取数组成员数 (stack) = 0)
<hr/>然后,大家还想看什么例子,欢迎留言。
其实挺想加那个await Task的例子的,但怕被x (逃
回复

使用道具 举报

4

主题

11

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2023-3-20 18:37:23 | 显示全部楼层
这边建议您不要用C#,可以考虑用 scratch / Excel / 我的世界 / Powershell / SQL RDBMS / Brainfuck 跟易语言比呢,都是图灵完备的,功能差不多
因为你用C#欺负小孩子太可恶了[生气]
回复

使用道具 举报

3

主题

6

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2023-3-20 18:37:57 | 显示全部楼层
那这Powershell有点欺负易语言,换成MS Access吧,图灵完备的都差不多
回复

使用道具 举报

0

主题

6

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2023-3-20 18:38:07 | 显示全部楼层
[看看你]你不觉得你说的这几个更过分嘛
回复

使用道具 举报

5

主题

8

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2023-3-20 18:38:44 | 显示全部楼层
第三个怎么了,有意见?
回复

使用道具 举报

2

主题

9

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2023-3-20 18:38:55 | 显示全部楼层
其实说真的,要是拿VB . NET过来那真就叫欺负人了,毕竟可是有人口口声声说自己是vb汉化版[捂脸]
回复

使用道具 举报

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-3-20 18:39:40 | 显示全部楼层
也是,我想想还有啥能跟易语言比的,我想不出来了,果然易语言很厉害啊[调皮]
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-3-20 18:39:54 | 显示全部楼层
mc过分了嗷
回复

使用道具 举报

2

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-3-20 18:40:04 | 显示全部楼层
图灵完备的,有问题?[调皮]
回复

使用道具 举报

2

主题

5

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-3-20 18:40:51 | 显示全部楼层
……好奇易语言有没有准备数学库,于是,仿佛趁机搞事一般,请求展示用ascii字符绘制正在屏幕上旋转的立方体。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表