0%

创建 Console App

创建文件夹 DockerHello ,在 term 执行命令

1
2
dotnet new console
dotnet run

容器化 .Net Core 程序

第一个 Dockerfile

创建没有后缀的的 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

# copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# copy and build everything else
COPY . ./
RUN dotnet publish -c Release -o out
ENTRYPOINT ["dotnet", "out/DockerHello.dll"]
````

### build and run

分别执行以下两个命令,分别是创建 image 和运行 image

```bash
docker build -t dotnetapp-dev .
docker run --rm dotnetapp-dev Hello from Docker

C#.NET 利用ToDictionary(),GroupBy(),可以将List转化为Dictionary,主需要一行代码!

首先看一下需求,已知cars,等于:

1
2
3
4
5
6
7
8
List<Car> cars = new List<Car>(){
new Car(1,"audiA6","private"),
new Car(2,"futon","merchant"),
new Car(3,"feiren","bike"),
new Car(4,"bukon","private"),
new Car(5,"baoma","private"),
new Car(6,"dayun","merchant")
};

1)我想以id为键,值为Car转化为一个字典idCarDict,方法如下:

var idCarDict = cars.ToDictionary(car=>car.id);

这样保证能正确转化的前提为,id在列表中没有重复值。如果有重复的,会抛出向字典中添加重复值的异常。

2)我想以type为键,值car的List的typeDict,方法如下:

Dictionary<string, List<Car>> typeCarDict = cars.GroupBy(car => car.type).ToDictionary(r => r.Key, r => r.ToList());

分步解释:
第一步分组

cars.GroupBy(car=>car.type) //返回的结果类型为: //IEnumerable<IGroup<string,car>>;

//其中string等于car.type,也就是分组的键
第二步将IEnumerable类型转化为字典,选取合适的键,

ToDictionary(r=>r.Key,r=>r.ToList());

//r参数代表分组对象,r.Key便是car.type;
//r.ToList()操作后将分组对象转化为List对象
这种转化代码简介,比以下foreach遍历得到以car.type的字典简洁许多:

1
2
3
4
5
6
7
8
var dict = new Dictionary<string,List<Car>>();
foreach(var car in cars)
{
if(dict.Contains(car.type))
dict[car.type].Add(car);
else
dict.Add(car.type,new List<Car>(){car}));
}

转的文章,希望自己能记住todictionary 的使用方法
链接

记录下见过的error,
产品环境的代码不一样但是和这个运行的结果是一样的
ConvertTimeToUtc

1
2
3
4
5
var tz = TimeZoneInfo.FindSystemTimeZoneById("W. Europe Standard Time");
var swedishTime = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);

System.ArgumentException: The conversion could not be completed because the supplied DateTime did not have the Kind property set correctly.

解决方式是 直接用了 new data(); 不适用utcnow

C# 开发的进化史

从简单的数据类型开始

排序和过滤

处理未知数据

LINQ 简介

COM和动态类

剖析.NET 平台

C# 委托

类型系统的特征

值类型和引用类型

C# 1 之外:构建于坚实基础之上的新特性

定义

我的问题

如何在编程中避免

查找到的相关博客的问题

面试被问到答错的问题

Q: Console.WriteLine(3); 是否发生了装箱

我的问题

在编码中没有注意Dictionary 是非线程安全的,以及对当前的注入的实例化的注入方式没有关注。结果在实现一个逻辑的时候在类中定义了一个 private 的 Dictionary ,结果导致有几率会导致当前县城 hang 住,我不确定为什么会导致方法 hang 住,而不是抛异常,这个问题是同事分析 dump 文件之后返回来的。所以对这个问题的根本原因还没有找到,google 了Dictionary 线程不安全的现象,也没有找到具体有人说过。自己写了test的代码,现象也是会抛异常而不是卡住。所以这个算是一个没有找到原因的现象。

无论是不是Dictionary 导致的hang, 这个地方的Dictionary会有线程安全问题是铁定的了。所以这个地方需要修正,能想到的方案有两个

方案1 Dictionary + lock

方案2 不要声明类的的私有属性

但是领导说让使用 ConcurrentDictionary,这就牵扯出来ConcurrentDictionary 的使用的问题。

ConcurrentDictionary 出现

ConcurrentDictionary 使用

ConcurrentDictionary 问题

初始化数据库

最近想看看ABP的代码,所以下载了一份代码,然后按照官方的的流程很容易就启动起来了。然后就回家折腾一下,结果回家就没那么轻松了,家里电脑有两台,分别是mac 和win10,对mac不是很熟悉,所以优先弄了下win10上的。
但是在win10中,在Package manager console 中运行update-database的时候会出现错误,错误内容是

1
2
   It was not possible to find any compatible framework version
The specified framework 'Microsoft.NETCore.App', version '2.1.0' was not found.

同样的代码,在公司只有一个警告,说的也是这块版本不太匹配,但是在家直接失败,这样会导致数据库初始化失败。但是没有研究,竟然不通,就先去mac上下载了代码,安装 mariadb,这里需要提到一点,想让maradb可以远程访问需要设置密码,在apply的时候注意填写密码,否则无法在其他机器上访问这个db。

记录下本次最在意的一点,.net core 的 ef 再mac上可以使用 dotnet 命令来进行数据库的初始化操作。具体使用command的 链接
具体命令:

1
2
dotnet ef database update

这命令也可以在win10 中运行,并且没有错误提示。完美绕过了 pcm的错误。
还是不会写文章,只是记录下自己经历中印象略深的。

test travis CI and IO page