https://leetcode.cn/problems/copy-list-with-random-pointer
给你一个长度为
n
的链表,每个节点包含一个额外增加的随机指针random
,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由
n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的next
指针和random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。// Definition for a Node. public class Node { public int val; public Node next; public Node random; public Node(int _val) { val = _val; next = null; random = null; } }

在编写UI的过程中,我们通常使用ObservableCollection
来监听列表的变化。然而,ObservableCollection
只能在添加/移动/移除元素时通知界面,这意味着元素内部更改时,ObservableCollection
是无法通知的
如果需要监听列表元素内部的更改,可以使用System.ComponentModel.BindingList
。
BindingList
作用是将列表中元素内部的更改"转发"到外部。由于需要监听每个元素内部的属性更改,BindingList
中的所有元素必须实现INotifyPropertyChanged
最近学习了源生成器,遂仿照CommunityToolkit/Windows中的DependencyPropertyGenerator写了个生成器,可自动生成Avalonia中的StyledProperty
和DirectProperty
NuGet:https://www.nuget.org/packages/PropertyGenerator.Avalonia
Github:https://github.com/zxbmmmmmmmmm/PropertyGenerator
在上文构建源生成器的过程中,我们使用字符串直接插入代码。这样做固然方便快捷,但字符串需要手动格式化,且无法检测拼写错误,这对需要生成复杂结构的源生成器项目很不友好。
本文将介绍生成代码的另一种方式:使用Roslyn API构建语法树。
什么是语法树 (Syntax Tree)?
语法树是编译器用于理解C#程序的数据结构。Roslyn在解析C#代码后就会生成一棵语法树,以供后续的进一步分析和编译。
一棵语法树由Node(节点)
、Token(标记)
、Trivia(额外信息)
构成。
C#9 引入了一个强大的机制:源生成器(Source Generator)。通过创建源生成器,我们可以简化大量重复编写的代码,或是减少反射来获得更强的性能以及AOT支持
本文将介绍如何从零开始创建一个最简单的源生成器
创建生成器项目
创建一个SourceGeneratorDemo.Generator项目,目标框架需要设置为.NET Standard 2.0
写不来捏
从C#3开始,拓展方法
这一特性就得到了广泛的应用。
此功能允许你能够使用实例方法的语法调用某个静态方法,以下是一个获取/创建文件的静态方法:
public static async Task<StorageFile> GetOrCreateFileAsync(this StorageFolder folder,string name)
{
var item = await folder.TryGetItemAsync(name) as StorageFile;
item ??= await folder.CreateFileAsync(name);
return item;
}
在Windows 11下,使用WinUI2.6以上版本的ListView
长这样:
然而到了Win10上,尽管其他控件的样式没有改变,但ListViewItem
变成了默认样式(初代Fluent)
最重大的问题是,Win10上的HorizontalAlignment
未被设置成Stretch
,可能造成严重的UI错位(隔壁livelyweather也有这个问题)。