小编Win*_*don的帖子

反序列化派生类时如何忽略基类 JsonConverter?

我有一个抽象基类:

[JsonConverter(typeof(Converter))]
public abstract class TextComponent {
    ...
    public bool Bold { get; set; }
    public TextComponent[] Extra { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

以及更多继承自它的类。其中一类是StringComponent

public sealed class StringComponent : TextComponent
{
    public string Text { get; set; }

    public StringComponent(string text)
    {
        Text = text;
    }
}
Run Code Online (Sandbox Code Playgroud)

Converter,这是一个JsonConverter应用于TextComponent看起来像这样:

private sealed class Converter : JsonConverter
{
    ....

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
        JsonSerializer serializer)
    {
        var tok = JToken.Load(reader); …
Run Code Online (Sandbox Code Playgroud)

c# json.net

3
推荐指数
1
解决办法
2097
查看次数

在不需要时强制使用互斥锁

我正在写一个游戏并且玩家列表定义如下:

pub struct PlayerList {
    by_name: HashMap<String, Arc<Mutex<Player>>>,
    by_uuid: HashMap<Uuid, Arc<Mutex<Player>>>,
}
Run Code Online (Sandbox Code Playgroud)

此结构具有添加,删除,获取玩家和获取玩家数量的方法.

NetworkServerServer这股名单如下:

NetworkServer {
    ...
    player_list: Arc<Mutex<PlayerList>>,
    ...
}

Server {
    ...
    player_list: Arc<Mutex<PlayerList>>,
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是Arc<Mutex>因为NetworkServer在不同的线程(网络循环)中访问列表.
当玩家加入时,会为他们生成一个线程并将它们添加到player_list中.

虽然我正在做的唯一操作就是增加player_list,但是我需要使用Arc<Mutex<Player>>而不是更自然的操作Rc<RefCell<Player>>,HashMap因为Mutex<PlayerList>需要它.我不是从网络线程(或任何其他线程)访问播放器,所以将它们置于a下是没有意义的Mutex.只HashMap需要锁定,我正在使用它Mutex<PlayerList>.但鲁斯特很迂腐,想要防止所有的误用.

因为我只是Player在主线程中访问s,所以每次执行锁定既烦人又不太高效.是否有解决方法而不是使用unsafe或什么?

这是一个例子:

use std::cell::Cell;
use std::collections::HashMap;
use std::ffi::CString;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::thread;

#[derive(Clone, Copy, PartialEq, Eq, Hash)]
struct …
Run Code Online (Sandbox Code Playgroud)

multithreading mutex rust

3
推荐指数
1
解决办法
209
查看次数

兼容的结构类型

C 11 标准定义结构兼容性如下 (6.2.7):

\n\n
\n

此外,在单独的翻译单元中声明的两个结构体、联合体或枚举类型如果其标记和成员满足以下要求,则它们是兼容的:如果其中一个使用标记进行声明,则另一个应使用相同的标记进行声明。如果两者都在各自翻译单元内的任何位置完成,则适用以下附加要求:其成员之间应存在一对一的对应关系,使得每对对应的成员都使用兼容类型\xe2\x80\xa6 进行声明

\n
\n\n

这意味着我可以有两个这样的文件:

\n\n

foo.c:

\n\n
struct struc {\n    int x;\n};\n\nint foo(struct struc *s)\n{\n    return s->x;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

主要.c:

\n\n
struct struc {\n    float x;\n};\n\nint foo(struct struc *s);\n\nint main(void)\n{\n    return foo(&(struct struc){1.2f});\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

闻起来像未定义的行为(就像 int 和 float 等类型一样)。但如果我正确理解了标准(也许我误解了第二句话),这是允许的。如果是这样,其背后的理由是什么?为什么不指定单独翻译单元中的结构也必须在结构上等效?

\n

c types language-lawyer

3
推荐指数
1
解决办法
261
查看次数

排序字典并获得前3名

我有一本存储"滑雪"锦标赛成员的字典.它还存储得分.我想要做的是能够找到并显示成员的前3个分数.我只是想知道当我陷入困境时,最好的办法是什么.以下是字典以及如何添加成员:

public static Dictionary<string, Skier> Skiers = new Dictionary<string, Skier>();

    static int income;


    string lodgeName;

    public SkiLodge(string newLodgeName)
    {
        newLodgeName = lodgeName;
        Skiers = new Dictionary<string, Skier>();
    }

    static int newNumber = 1;
    //ADD SKIER
    public Skier AddSkier(string inName, string inAddress, int inScore)
    {
        string newNumberString = newNumber.ToString();
        Skier result = new Skier(newNumberString, inName, inAddress, inScore);
        newNumber = newNumber + 1;
        Skier S = new Skier(newNumberString, inName, inAddress, inScore);
        Skiers.Add(newNumberString, S);
        income = income + 100;
        return result;
    }
Run Code Online (Sandbox Code Playgroud)

c# dictionary

2
推荐指数
1
解决办法
146
查看次数

在C#中的代码开头和之后更改标签的文本

我有以下代码,它将从.php网站上的文件中获取一些数据,它将格式化数据并在表单上显示它.(使用visual studio)有时获取数据需要一些时间.所以我希望U在获取数据期间将名称更改为"Refreshing ..." 的标签.所以我使用了下面的代码.(我正在展示相关部分)

private void refresh(object sender, MouseEventArgs e)
    {
        U.Text = "Refreshing ...";
        string r = HttpGet("http://www.example.com/?Fetch=OK");
        U.Text = "Done";
    }
Run Code Online (Sandbox Code Playgroud)

但是这段代码并没有将文本更改为"刷新...",即使提取需要1分钟,它也只会更改为"完成".这里发生了什么事?我怎样才能使它工作?

c#

1
推荐指数
1
解决办法
50
查看次数

斐波那契数列对大数出错

我刚刚开始学习 C++,这是我用于生成斐波那契数列的 C++ 代码。

#include <iostream>

using namespace std;

int main()
{
    int n;
    while(true){
        cout << "Enter the number of terms upto which a the fibonocci sequence should be generated: ";
    cin >> n;
    cout << "------------------------" << endl;
    long long fib1 = 1;
    long long fib2 = 1;
    long long fibnext;
    cout << 1 << " " << fib1 << endl << 2 << " " << fib2 <<endl;

    for (int i =1; i <= n-2; ++i){
        fibnext …
Run Code Online (Sandbox Code Playgroud)

c++

1
推荐指数
1
解决办法
1844
查看次数

使用 JsonReader 而不是 JsonSerializer 时,自定义 JsonConverter 不起作用

我有一个类Foo,其FooConverter定义如下:

[JsonConverter(typeof(FooConverter))]
public class Foo
{
    public string Something { get; set; }
}

public class FooConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((Foo)value).Something);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        var str = reader.ReadAsString();
        if (str == null)
        {
            throw new JsonSerializationException();
        }    
        // return new Foo {Something = serializer.Deserialize<string>(reader)};
        return new Foo {Something = str};
    }

    public override bool CanConvert(Type objectType) …
Run Code Online (Sandbox Code Playgroud)

c# json.net

1
推荐指数
1
解决办法
2279
查看次数

AT&amp;T 语法 hello world 有效,但 intel 语法无效

我正在使用 GAS 汇编器为 linux x86_64 编写一个 hello world 程序,这是我的 AT&T 语法代码。

#.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    movq  $1, %rax
    movq  $1, %rdi
    movq  $msg, %rsi
    movq  $12, %rdx
    syscall

    movq  $60, %rax
    movq  $0, %rdi
    syscall
Run Code Online (Sandbox Code Playgroud)

这有效并打印“hello world”。这是英特尔语法:

.intel_syntax noprefix

.section .data
    msg:
        .ascii "hello world\n"
.section .text
.globl _start
_start:
    mov rax, 1
    mov rdi, 1
    mov rsi, msg
    mov rdx, 12
    syscall

    mov rax, 60
    mov rdi, 0
    syscall
Run Code Online (Sandbox Code Playgroud)

这编译并运行良好,但不打印“hello …

assembly x86-64 gnu-assembler intel-syntax

1
推荐指数
1
解决办法
1618
查看次数

array.GetLength 为多维数组抛出超出范围的异常

我有这个简单的代码。

        int[][] array = {
                    new int[] {1,2,3},
                    new int[] {4,5,6},
                  };

        int yLength = array.GetLength(1);
Run Code Online (Sandbox Code Playgroud)

但是最后一行抛出了一个超出范围的异常。这是为什么?GetLength在这种情况下它不应该返回 3 吗?还是 GetLength 仅适用于方形数组?(T[,] 数组)?
如果是这样,我如何使用循环遍历锯齿状数组for

c#

0
推荐指数
1
解决办法
2266
查看次数

方法组的行为与la​​mbda不同?

Moq用来模拟一些界面.这里是:

var titleGenerator = new Mock<ITitleGenerator>();
titleGenerator.Setup(t => t.GenerateTitle()).Returns(Guid.NewGuid().ToString);

Console.WriteLine(titleGenerator.Object.GenerateTitle());
Console.WriteLine(titleGenerator.Object.GenerateTitle());
Run Code Online (Sandbox Code Playgroud)

它打印两次相同的值.但如果我用这个替换第二行:

titleGenerator.Setup(t => t.GenerateTitle()).Returns(() => Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

它会在每次调用时返回唯一值.

我一直以为方法组只是lambda表达式的快捷方式.有什么区别吗?我试着在文档中搜索任何解释.有人可以开导我吗?

它看起来像方法组一次评估表达式并以某种方式缓存它?或者它有什么关系Moq

c# moq

0
推荐指数
1
解决办法
194
查看次数

循环中的Readline()在python中不起作用

我有一个file用这个文字调用的文件:

Hello
I am not a bot
I am a human
Do you believe me?
I know you won't
Yes I am a bot
Yes you thought it right
Run Code Online (Sandbox Code Playgroud)

此代码打印出文本的所有行:

with open(file) as f:
    for i in f:
        print(i,end="")
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有,我不明白为什么.

with open(file) as f:
    for i in f:
        print(f.readline(),end="")
Run Code Online (Sandbox Code Playgroud)

打印出:

I am not a bot
Do you believe me?
Yes I am a bot
Run Code Online (Sandbox Code Playgroud)

我理解的是当循环遍历文件中的行时,它将读取该行并将其作为字符串返回,然后打印.如果我替换for循环for i in range(9),它的工作原理.

python readline

-1
推荐指数
1
解决办法
929
查看次数

集合是否可变?

在下面的例子中,所做的更改List B直接反映在int中List A.

   List<string> A = new List<string>();
   A.Add("1");
   List<string> B = new List<string>();
   B = A;
   foreach (string value in B)
   {
       Console.WriteLine("B= " + value);
   }
   B.Add("2");
   foreach (string value in A)
   {
       Console.WriteLine("A= " + value);
   }
Run Code Online (Sandbox Code Playgroud)

输出是

B = 1

A = 1

A = 2

即使我使用了输出也是相同的Arraylist.

如果是字符串,则行为不然!

String s1 = "abc";
String s2 = s1;
s2 += "TEST";
Console.WriteLine("S1=" + s1 + "    S2=" + s2);
Run Code Online (Sandbox Code Playgroud)

输出是

S1 = …

c# collections

-1
推荐指数
1
解决办法
2860
查看次数

如何使用Linq更改字符串中的特定字符

我有这样的字符串结构:

Exec Test @totalRows = 10 ,@DateCriteria = 'nd',@NDays = -7 ,@GroupIds = '3,4,6,7',@OrderBy = 'DESC'

我试图改变'3,4,6,7'任何单个值,如3或45或65等 '3,4,6,7'可以用逗号分隔N个数字之类的'1,2,3,45,33,111,33'.这些基本上都是ID.我想用一个单一的值来改变它们.所以我需要的字符串将变成:

Exec Test @totalRows = 10 ,@DateCriteria = 'nd',@NDays = -7 ,@GroupIds = '455',@OrderBy = 'DESC'

455 只是一个例子,它可以是任何整数值.

到目前为止,我没有Linq试过这个

string[] tempQuery = query.Split(',');

for (int i = 0; i < tempQuery.Length; i++)
{
    if (tempQuery[i].Contains("@GroupIds"))
        myQuery = myQuery + ",@GroupIds = '" + ddlTeams.SelectedValue + "'";
    else
        myQuery = myQuery + "," + tempQuery[i];
}
Run Code Online (Sandbox Code Playgroud)

c# linq

-2
推荐指数
1
解决办法
335
查看次数