我使用类型注释来进行一些基本的类型检查和自动类型转换。
作为其中的一部分,我希望检查给定类型是否应可分配给数据类的某些字段,即该类型是否与我的数据类上的类型注释“兼容”。
是否有任何开箱即用的方法来检查给定类型是否可分配给其他类型?IE
from typing import Optional, Union, Annotated, Type
def is_assignable(from_what: Type, to_what: Type) -> bool:
// .. how?
is_assignable(int, int) // should be true
is_assignable(int, Optional[int]) should be true
is_assignable(int, Annotated[Union[str, Optional[int]], "hello world"]) // should be true
is_assignable(float, Annotated[Union[str, Optional[int]], "hello world"]) // False. Can't assign float to Annotated[Union[str, Optional[int]], "hello world"])
Run Code Online (Sandbox Code Playgroud)
我可以尝试自己解开所有的typing.*逻辑,即解开Optional、Union、Annotated等等,但这感觉相当难看(而且不太可维护,如果在最近的python版本中添加了新的东西)。
我试图找出一个正则表达式,它产生单引号(')之间的任何字符串,如果该字符串包含给定的单词.
例如,假设我有以下文本,并且我希望匹配包含单词"test"的单引号之间的所有内容:
Some sample text,
'this is test a match' and
'this is not a match' but
'this is a match again because it contains the word test'.
This "is not a test match because its double quotes".
And this is not a test match either because this is not encapsulated in quotes.
Run Code Online (Sandbox Code Playgroud)
正则表达式需要返回两个匹配,即
"this is a test match"
"this is a match again because it contains the word test"
Run Code Online (Sandbox Code Playgroud)
我在这里有点失落.我试过text.match(/'(.*?)'/); 返回单引号之间的所有内容,然后对子字符串匹配进行函数检查.但奇怪的是,正则表达式似乎甚至没有返回单引号属性中的所有字符串.
非常感谢指针..谢谢!
假设您有32位数据类型:
// The letters are just to identify the position of each bit later in the post
abcdefgh ijklmnop qrstuvwx yzABCDEF
Run Code Online (Sandbox Code Playgroud)
我正在记录在某些位置"丢弃"位的最有效方法,其中丢弃意味着"移除"给定位,并移动以下位以填充其位置.
示例:假设我想删除"a"和"q"位.然后结果应该看起来像:
bcdefghi jklmnopr stuvwxyz ABCDEF00
Run Code Online (Sandbox Code Playgroud)
要么
00bcdefg hijklmno prstuvwx yzABCDEF
Run Code Online (Sandbox Code Playgroud)
这两种结果都是可以接受的.
在我的具体情况下,我也可以施加以下约束:
目前我正在使用这样的方法(伪代码):
// called with number = abcdefgh ijklmnop qrstuvwx yzABCDEF
auto drop_bits_1_16(unsigned int number)
{
number = number << 1; // number becomes: bcdefghi jklmnopq rstuvwxy zABCDEF0
unsigned number1 = number & 0xFFFE0000; // number1 comes: bcdefghi jklmnop0 00000000 00000000 …Run Code Online (Sandbox Code Playgroud) 假设你有类似的东西
class Person {
LocalDate bornOn;
LocalDate diedOn;
}
Run Code Online (Sandbox Code Playgroud)
假设您有一堆“ Person”实例,可以按照自己喜欢的任何方式进行存储。
编写可以列出给定时间所有在世人员的有效功能的最佳方法是什么?
数据结构也应该是有效可变的,尤其是在添加新元素方面。
即在概念上像
List<Person> alive(List<Person> people, LocalDate date) {
return people.stream().filter(x -> x.bornOn.compareTo(date) <= 0 && x.diedOn.compareTo(date) > 0).collect(Collectors.toList())
}
Run Code Online (Sandbox Code Playgroud)
才更有效率。
我的第一感觉就是拥有两个NavigableMaps
NavigableMap<LocalDate, Person> peopleSortedByBornOn;
NavigableMap<LocalDate, Person> peopleSortedByDiedOn;
Run Code Online (Sandbox Code Playgroud)
每个查询都可以使用给定日期的headMap()/ tailMap()进行查询,并且这些查询的交集将成为结果。
是否有任何更快或更方便的解决方案?甚至某种支持这种操作的广泛使用的Java集合/地图类型?
我正在使用Entity Framework并且想要在数据库中插入一个对象,该对象引用了DB中尚不存在的另一个对象(但外键已知).
简单的例子:假设我有两个表Books(由他们的ISBN标识)和Purchases.我希望能够插入购买,即使该书尚未在数据库中设置:
public class Book
{
[Key]
public virtual string ISBN { get; set; }
protected virtual IEnumerable<Purchase> purchases { get; set; }
public virtual string author { get; set; }
public virtual string title { get; set; }
// .....
}
public class Purchase
{
[Key]
protected virtual int id { get; set; }
public virtual Book book { get; set; }
public virtual double price;
}
Run Code Online (Sandbox Code Playgroud)
从概念上讲,这很容易:Purchase表格将有一个外键,即书籍的ISBN.因此,在常规SQL中,我可以将ISBN插入此字段,稍后将该书添加到books表中.
在EF/C#中,我想不出一个简单的方法来做到这一点.本Purchase类引用Book …
我是一个相对好的程序员,但到目前为止,我主要关注的是使用C#进行应用程序开发.我几乎没有游戏开发和3D引擎的经验 - 我已经开始阅读3D引擎的一般工作方式,例如,有一本很棒的指南解释了如何在C#中开发一个非常简单的基于软件的3D引擎.非常有帮助,但这几乎总结了我对该主题的整体经验.此外,到目前为止,我还没有真正使用过C++(尽管我已经意识到与C#的基本概念差异,并且会考虑在该语言中至少达到"足够"的速度可管理).
所以无论如何,出于纯粹的个人兴趣,我想开发 - 或者更确切地说,学习如何开发 - 用于教育目的的简单的基于DirectX的3D图形引擎.我只是对图形部分感兴趣(没有声音/动画/游戏状态/网络或其他什么,只有非常基本的输入).渲染一些简单的几何,然后逐步学习如何使用更现代的着色技术扩展它将是好的.
我已经找到了一些很好的资源.但在我深入研究这个主题之前:我知道DirectX12即将到来,并且看到它在多大程度上改进了系统,我真的不确定是否会对API进行许多重大修改.或者换句话说:我担心我现在开始学习DirectX 11的东西,从现在起几个月内,从编程的角度来看,DirectX 12的工作方式会有很大的不同,这一切都是无用的.
我不确定这已经知道了多少,或者是否有开发者以前可以向更广泛的公众开放.但如果它可以告诉你:你们是否会建议我等待DX12,或者从v11开始,因为未来的开发将非常相似?
为了记录,我当然知道学习DX11在任何情况下都不会受到伤害.但我并不急于求成,如果我现在学到的一半在几个月内就会过时,我宁愿等到那时才能慢慢开始.
我有一个使用LZMA2压缩(压缩级别:超)的7zip存档。该档案文件包含1,749个文件,最初的总大小为661mb。压缩文件的大小为39mb。
现在,我正在尝试使用C#从此存档中提取一个很小的文件(大约200kb)。
我从IArchive(工作速度相对较快)中获取了相应的IArchiveEntry,但是随后调用IArchiveEntry.WriteToFile(targetPath)大约需要33秒!同样,如果我改为写入内存流,时间也很长。(编辑:当我在压缩级别=正常的7z LZMA2存档上运行此文件时,它仍需要9秒钟)
当我在实际的7zip应用程序中打开相同的存档并从那里提取相同的文件时,它只需要2-3秒。我怀疑这是多核(7zip)与单核(可能是ShapCompress吗?),但是我没有注意到7zip解压缩期间的CPU使用率激增。.也许它太快了,以至于无法注意到。
有人知道SharpCompress这么慢的速度可能是什么问题吗?我可能会缺少某些设置或使用了错误的工厂(ArchiveFactory)吗?
如果不是-是否有任何C#库在解压缩该库时可能会更快?
作为参考,这是我如何使用SharpCompress提取的草图:
private void Extract()
{
using(var archive = GetArchive())
{
var entryPath = /* ... path to entry .. */
var entry = TryGetEntry(archive, entryPath);
entry.WriteToFile(some_target_path);
}
}
private IArchive GetArchive()
{
string path = /* .. path to my .7z file */;
return ArchiveFactory.Open(path);
}
private IArchiveEntry TryGetEntry(IArchive archive, string path)
{
path = path.Replace("\\", "/");
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
if (entry.Key == path)
return entry;
} …Run Code Online (Sandbox Code Playgroud) 假设我们有一个指向数组的子范围的跨度。
假设初始底层数组有足够的容量,有没有办法增加这个跨度?(假设我们不能使用
例子:
int[] array = new int[]{4, 17, 0, 2, 3, 16, 1};
var span = new Span<int>(array);
var s1 = span.Slice(0, 1);
// Assume we can't use "array" directly here anymore, but only s1
var s2 = s1.Slice(0, 2); // bang! Argument of ouf range exception, even though array would have enough capacity
Run Code Online (Sandbox Code Playgroud) 考虑以下:
interface ISomething
{
void Call(string arg);
}
sealed class A : ISomething
{
public void Call(string arg) => Console.WriteLine($"A, {arg}");
}
sealed class Caller<T> where T : ISomething
{
private readonly T _something;
public Caller(T something) => _something = something;
public void Call() => _something.Call("test");
}
new Caller<A>(new A()).Call();
Run Code Online (Sandbox Code Playgroud)
对 Caller<A>.Call 的调用以及对 A.Call 的嵌套 tcall 都是通过 callvirt 指令进行的。
但为什么?这两种类型都是众所周知的。除非我误解了什么,否则这里不应该使用 call 而不是 callvirt 吗?
如果是这样 - 为什么不这样做?这仅仅是编译器未完成的优化,还是背后有任何特定原因?
c# ×4
algorithm ×2
c++ ×2
3d ×1
cil ×1
compression ×1
direct3d ×1
directx ×1
game-engine ×1
java ×1
javascript ×1
lzma ×1
performance ×1
python ×1
python-3.9 ×1
regex ×1