windows C#-对象和集合初始值设定项(下)

news/2025/1/2 2:11:23/
集合初始值设定项

在初始化实现 IEnumerable 的集合类型和初始化使用适当的签名作为实例方法或扩展方法的 Add 时,集合初始值设定项允许指定一个或多个元素初始值设定项。 元素初始值设定项可以是值、表达式或对象初始值设定项。 通过使用集合初始值设定项,无需指定多个调用;编译器将自动添加这些调用。

下面的示例演示了两个简单的集合初始值设定项:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

下面的集合初始值设定项使用对象初始值设定项来初始化上一个示例中定义的 Cat 类的对象。 各个对象初始值设定项括在大括号中且用逗号隔开。

List<Cat> cats = new List<Cat>
{new Cat{ Name = "Sylvester", Age=8 },new Cat{ Name = "Whiskers", Age=2 },new Cat{ Name = "Sasha", Age=14 }
};// 如果集合的 Add 方法允许,则可以将 null 指定为集合初始值设定项中的一个元素。
List<Cat?> moreCats = new List<Cat?>
{new Cat{ Name = "Furrytail", Age=5 },new Cat{ Name = "Peaches", Age=4 },null
};// 如果集合支持读取/写入索引,可以指定索引元素。
var numbers = new Dictionary<int, string>
{[7] = "seven",[9] = "nine",[13] = "thirteen"
};// 前面的示例生成调用 Item[TKey] 以设置值的代码。 还可使用以下语法初始化字典和其他关联容器。 
// 请注意,它使用具有多个值的对象,而不是带括号和赋值的索引器语法:
var moreNumbers = new Dictionary<int, string>
{{19, "nineteen" },{23, "twenty-three" },{42, "forty-two" }
};

此初始值设定项示例调用 Add(TKey, TValue),将这三个项添加到字典中。 由于编译器生成的方法调用不同,这两种初始化关联集合的不同方法的行为略有不同。 这两种变量都适用于 Dictionary 类。 其他类型根据它们的公共 API 可能只支持两者中的一种。

具有集合只读属性初始化的对象初始值设定项

某些类可能具有属性为只读的集合属性,如以下示例中 CatOwner 的 Cats 属性:

public class CatOwner
{public IList<Cat> Cats { get; } = new List<Cat>();
}// 由于无法为属性分配新列表,因此你无法使用迄今为止讨论的集合初始值设定项语法:
CatOwner owner = new CatOwner
{Cats = new List<Cat>{new Cat{ Name = "Sylvester", Age=8 },new Cat{ Name = "Whiskers", Age=2 },new Cat{ Name = "Sasha", Age=14 }}
};// 但是,可以通过省略列表创建 (new List<Cat>),使用初始化语法将新条目添加到 Cats,如下所示:
CatOwner owner = new CatOwner
{Cats ={new Cat{ Name = "Sylvester", Age=8 },new Cat{ Name = "Whiskers", Age=2 },new Cat{ Name = "Sasha", Age=14 }}
};// 要添加的条目集显示在大括号中。 上述代码与编写代码相同:
CatOwner owner = new ();
owner.Cats.Add(new Cat{ Name = "Sylvester", Age=8 });
owner.Cats.Add(new Cat{ Name = "Whiskers", Age=2 });
owner.Cats.Add(new Cat{ Name = "Sasha", Age=14 });
示例

下例结合了对象和集合初始值设定项的概念。

public class InitializationSample
{public class Cat{// Automatically implemented properties.public int Age { get; set; }public string? Name { get; set; }public Cat() { }public Cat(string name){Name = name;}}public static void Main(){Cat cat = new Cat { Age = 10, Name = "Fluffy" };Cat sameCat = new Cat("Fluffy"){ Age = 10 };List<Cat> cats = new List<Cat>{new Cat { Name = "Sylvester", Age = 8 },new Cat { Name = "Whiskers", Age = 2 },new Cat { Name = "Sasha", Age = 14 }};List<Cat?> moreCats = new List<Cat?>{new Cat { Name = "Furrytail", Age = 5 },new Cat { Name = "Peaches", Age = 4 },null};// Display results.System.Console.WriteLine(cat.Name);foreach (Cat c in cats){System.Console.WriteLine(c.Name);}foreach (Cat? c in moreCats){if (c != null){System.Console.WriteLine(c.Name);}else{System.Console.WriteLine("List element has null value.");}}}// Output://Fluffy//Sylvester//Whiskers//Sasha//Furrytail//Peaches//List element has null value.
}

以下示例演示了一个对象,该对象实现 IEnumerable 并包含具有多个参数的 Add 方法。 它使用一个集合初始值设定项,其中列表中的每个项都有多个元素,这些元素对应于 Add 方法的签名。

public class FullExample
{class FormattedAddresses : IEnumerable<string>{private List<string> internalList = new List<string>();public IEnumerator<string> GetEnumerator() => internalList.GetEnumerator();System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => internalList.GetEnumerator();public void Add(string firstname, string lastname,string street, string city,string state, string zipcode) => internalList.Add($"""{firstname} {lastname}{street}{city}, {state} {zipcode}""");}public static void Main(){FormattedAddresses addresses = new FormattedAddresses(){{"John", "Doe", "123 Street", "Topeka", "KS", "00000" },{"Jane", "Smith", "456 Street", "Topeka", "KS", "00000" }};Console.WriteLine("Address Entries:");foreach (string addressEntry in addresses){Console.WriteLine("\r\n" + addressEntry);}}/** Prints:Address Entries:John Doe123 StreetTopeka, KS 00000Jane Smith456 StreetTopeka, KS 00000*/
}

Add 方法可使用 params 关键字来获取可变数量的自变量,如下例中所示。 此示例还演示了索引器的自定义实现,以使用索引初始化集合。 从 C# 13 开始,params 参数不再局限于数组。 它可以是集合类型或接口。

public class DictionaryExample
{class RudimentaryMultiValuedDictionary<TKey, TValue> : IEnumerable<KeyValuePair<TKey, List<TValue>>> where TKey : notnull{private Dictionary<TKey, List<TValue>> internalDictionary = new Dictionary<TKey, List<TValue>>();public IEnumerator<KeyValuePair<TKey, List<TValue>>> GetEnumerator() => internalDictionary.GetEnumerator();System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() => internalDictionary.GetEnumerator();public List<TValue> this[TKey key]{get => internalDictionary[key];set => Add(key, value);}public void Add(TKey key, params TValue[] values) => Add(key, (IEnumerable<TValue>)values);public void Add(TKey key, IEnumerable<TValue> values){if (!internalDictionary.TryGetValue(key, out List<TValue>? storedValues)){internalDictionary.Add(key, storedValues = new List<TValue>());}storedValues.AddRange(values);}}public static void Main(){RudimentaryMultiValuedDictionary<string, string> rudimentaryMultiValuedDictionary1= new RudimentaryMultiValuedDictionary<string, string>(){{"Group1", "Bob", "John", "Mary" },{"Group2", "Eric", "Emily", "Debbie", "Jesse" }};RudimentaryMultiValuedDictionary<string, string> rudimentaryMultiValuedDictionary2= new RudimentaryMultiValuedDictionary<string, string>(){["Group1"] = new List<string>() { "Bob", "John", "Mary" },["Group2"] = new List<string>() { "Eric", "Emily", "Debbie", "Jesse" }};RudimentaryMultiValuedDictionary<string, string> rudimentaryMultiValuedDictionary3= new RudimentaryMultiValuedDictionary<string, string>(){{"Group1", new string []{ "Bob", "John", "Mary" } },{ "Group2", new string[]{ "Eric", "Emily", "Debbie", "Jesse" } }};Console.WriteLine("Using first multi-valued dictionary created with a collection initializer:");foreach (KeyValuePair<string, List<string>> group in rudimentaryMultiValuedDictionary1){Console.WriteLine($"\r\nMembers of group {group.Key}: ");foreach (string member in group.Value){Console.WriteLine(member);}}Console.WriteLine("\r\nUsing second multi-valued dictionary created with a collection initializer using indexing:");foreach (KeyValuePair<string, List<string>> group in rudimentaryMultiValuedDictionary2){Console.WriteLine($"\r\nMembers of group {group.Key}: ");foreach (string member in group.Value){Console.WriteLine(member);}}Console.WriteLine("\r\nUsing third multi-valued dictionary created with a collection initializer using indexing:");foreach (KeyValuePair<string, List<string>> group in rudimentaryMultiValuedDictionary3){Console.WriteLine($"\r\nMembers of group {group.Key}: ");foreach (string member in group.Value){Console.WriteLine(member);}}}/** Prints:Using first multi-valued dictionary created with a collection initializer:Members of group Group1:BobJohnMaryMembers of group Group2:EricEmilyDebbieJesseUsing second multi-valued dictionary created with a collection initializer using indexing:Members of group Group1:BobJohnMaryMembers of group Group2:EricEmilyDebbieJesseUsing third multi-valued dictionary created with a collection initializer using indexing:Members of group Group1:BobJohnMaryMembers of group Group2:EricEmilyDebbieJesse*/
}

http://www.ppmy.cn/news/1559217.html

相关文章

《Vue.js设计与实现》权衡的艺术、框架设计的核心要素

最近在阅读霍春阳的《Vue.js设计与实现》&#xff0c;记录了其中一些重点内容&#xff0c;刚读第一遍有些章节还是有些难以理解&#xff0c;多读几遍就会有不一样的收获~~ vue是一个声明式、运行时编译时的框架&#xff0c; 那么它为什么要采用这种方式&#xff1f; 1. 权衡的…

Vue.js组件开发-实现列表无缝动态滚动

Vue.js组件开发中&#xff0c;实现列表的无缝动态滚动可以通过结合CSS动画和Vue的响应式数据绑定来完成。 步骤&#xff1a; ‌1.准备数据和模板‌&#xff1a; 在Vue组件的data中定义一个数组来存储列表项。 在模板中使用v-for指令来渲染列表。 ‌2.设置CSS样式‌&#xf…

KaiOS 4.0 | DataCall and setupData implemention

相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…

算法题(18):删除有序数组中的重复项2

审题&#xff1a; 需要原地删除数据让数组中一个数据只能出现最多2次&#xff0c;并返回修改后的数组的数据个数 &#xff08;不会有空数组情况&#xff09; 思路&#xff1a; 双指针&#xff1a;我们用left指向下一个需要插入数据的位置&#xff0c;right去遍历数组 left数据的…

在线学习平台-项目技术点-前台

报错解决方法 1、P166-尚硅谷_在线教育_Nuxt整合错误_nuxt friendly-errors-CSDN博客 2、P168 3、P170 4、P173 npm remove axios npm install axios0.18.0 1、服务端渲染技术NUXT 1.1服务端渲染SSR 服务端渲染又称SSR (Server Side Render)是在服务端完成页面的内容&…

TCP网络编程:CLOSE_WAIT和TIME_WAIT导致端口耗尽的问题与解决方案

TCP网络编程&#xff1a;CLOSE_WAIT和TIME_WAIT导致端口耗尽的问题与解决方案 1. 直接上解决方案 1.1 解决CLOSE_WAIT过多的问题 这个问题很简单, 就是你忘记close套接字了 CLOSE_WAIT状态的根源是代码逻辑未正确关闭套接字。 CLOSE_WAIT表示本端接收到了对端发送的FIN&…

Android 版本号、代号、API级别对应关系汇总

Android 版本的数字和字母对应关系如下&#xff1a; Android 版本代号API 级别Android 16W36Android 15V35Android 14U34Android 13T33Android 12LS32Android 12.0S31Android 11.0R30Android 10.0Q29Android 9.0Pie28Android 8.1Oreo27Android 8.0Oreo26Android 7.1.1Nougat25…

一种基于XC7V690T的在轨抗单粒子翻转系统(一)

介绍一种基于XC7V690T的在轨抗单粒子翻转系统架构&#xff0c;可以提高XC7V690T在轨抗单粒子翻转的能力及配置文件注数修改的灵活性。 1.硬件架构 某航天器通信机采用侧向层叠结构形式&#xff0c;共分为4个模块&#xff0c;由后至前依次为电源模块、射频模块、刷新模块及信号…