c#中Empty()和DefalutIfEmpty()用法分析

本文实例分析了c#中Empty()和DefalutIfEmpty()用法。分享给大家供大家参考。具体分析如下:

在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null。但通常的做法是返回一个空的集合。

假设有这样一个场景:当商店不营业时,返回一个空的IEnumerable<Product>,而当商店正常营业时,就返回一个非空的IEnumerable<Product>。

Product模型。

代码如下:

public class Product
{
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
}

该商店有一个ProductService类,该类根据属bool类型属性IsClosed来决定是否返回空的IEnumerable<Product>。

代码如下:

public class ProductService
{
        public bool IsClosed { get; set; }

private static IEnumerable<Product> GetAllProducts()
        {
            return new List<Product>()
            {
                new Product(){Id = 1, Name = "Product1", Price = 85M},
                new Product(){Id = 2, Name = "Product2", Price = 90M}
            };
        }

public IEnumerable<Product> ShowProducts()
        {
            if (!IsClosed)
            {
                return GetAllProducts();
            }
            return new List<Product>(0);
        }
}

在客户端,假设我们设置为不营业。

代码如下:

class Program
{
        static void Main(string[] args)
        {
            ProductService service = new ProductService();
            service.IsClosed = true;

IEnumerable<Product> products = service.ShowProducts();
            if (products.Count() > 0)
            {
                foreach (var prod in products)
                {
                    Console.WriteLine("产品:{0},价格:{1}",prod.Name, prod.Price);
                }
            }
            else
            {
                Console.WriteLine("今天不营业~~");
            }
            Console.ReadKey();
        }
}

输出结果:今天不营业~~

这样做确实没什么问题,但问题是:当通过 new List<Product>(0)返回空的集合时,为其分配了内存。对于一个只读的、空的集合类型,是否可以做到不耗费内存呢?

--答案是使用Enumerable类的静态方法Empty()。

在ProductService的ShowProducts()中修改如下:

代码如下:

public IEnumerable<Product> ShowProducts()
{
    if (!IsClosed)
    {
 return GetAllProducts();
    }
    return Enumerable.Empty<Product>();
}

输出结果:今天不营业~~

如果在不营业的时候,我们还是想展示一些产品,比如把产品放在迎街玻璃橱窗中展示,如何做到呢?

--这时,我们可以考虑使用Enumerable类的静态类方法DefaultIfEmpty()。

继续修改ProductService,添加一个返回默认IEnumerable<Product>的方法:

代码如下:

private static IEnumerable<Product> GetDefaultProducts()
{
    return new List<Product>()
    {
 new Product(){Id = 1, Name = "Product1", Price = 85M}
    };
}

修改ProductService的ShowProducts()方法如下:

代码如下:

public IEnumerable<Product> ShowProducts()
{
    if (!IsClosed)
    {
 return GetAllProducts();
    }
    return Enumerable.DefaultIfEmpty(GetDefaultProducts());
}

总结:

Empty<T>和DefaultIfEmpty(IEnumerable<T>)都是Enumerable类的静态方法,给出了当返回的集合类型为空时的处理方法:

● 如果想获取一个空的集合,使用Enumerable.Empty<T>()
● 如果想给获取到的、空的集合一个默认值,使用Enumerable.DefaultIfEmpty(IEnumerable<T>)

希望本文所述对大家的C#程序设计有所帮助。

(0)

相关推荐

  • asp.ent(C#)中判断空字符串的3种方法以及性能分析

    3种方法分别是: string a=""; 1.if(a=="") 2.if(a==String.Empty) 3.if(a.Length==0) 3种方法都是等效的,那么究竟那一种方法性能最高呢?本人用实验说明问题. 建立3个aspx页面(为什么用网页,主要是利用Microsoft Application Center Test ) WebForm1.aspx 复制代码 代码如下: private void Page_Load(object sender, Sys

  • 浅谈C# 中的可空值类型 null

    C# 不允许把 null 赋给一个值类型的数据.在 C# 中,以下语句是非法的: 复制代码 代码如下: int a = null;    // 非法 但是,利用 C# 定义的一个修饰符,可将一个变量声明为一个可空(nullable)值类型.可空值类型在行为上与普通值类型相似,但可以将一个 null 值赋给它.如下所示: 复制代码 代码如下: int? a = null;      // 合法 当把一个变量定义为可空值类型时,该变量依然可以被赋值为 0,代码如下所示: 复制代码 代码如下: usi

  • C#中string.Empty和null的区别详解

    这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得都是不求甚解,有一些还是在误导别人.下面我来说下我对这三者的理解,如有错误的地方请大家及时指正. 一:""与string.Empty我认为是一样的.网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间,我认为这句话是错误并且含糊不清的. 1.实际上Empty是string类中的一个静态的只读字段,他的定义是这样的: public stat

  • C# 判断字符串为空的几种办法

    1. 三种常用的字符串判空串方法:Length法:bool isEmpty = (str.Length == 0);Empty法:bool isEmpty = (str == String.Empty);General法:bool isEmpty = (str == "");2. 深入内部机制:要探讨这三种方法的内部机制,我们得首先看看.NET是怎样实现的,也就是要看看.NET的源代码!然而,我们哪里找这些源代码呢?我们同样有三种方法:Rotor法:一个不错的选择就是微软的Rotor,

  • C# 判断字符为空的6种方法的效率实测对比

    C#中提供了相当丰富的方法或属性来判断一个字符是否为空,常用的方法有以下6种 1. strTest== "" 2. strTest.Equals("") 3. strTest== string.Empty 4. strTest.Equals(string.Empty) 5. strTest.Length == 0 6. string.IsNullOrEmpty(strTest) 为了对以上6种方法的效率,有个直观的感受,我特意编写了以下的测试代码: using Sy

  • c#中Empty()和DefalutIfEmpty()用法分析

    本文实例分析了c#中Empty()和DefalutIfEmpty()用法.分享给大家供大家参考.具体分析如下: 在项目中,当我们想获取IEnumerable<T>集合的时候,这个集合有可能是null.但通常的做法是返回一个空的集合. 假设有这样一个场景:当商店不营业时,返回一个空的IEnumerable<Product>,而当商店正常营业时,就返回一个非空的IEnumerable<Product>. Product模型. 复制代码 代码如下: public class

  • vue中插槽整理及用法分析

    本教程操作环境:windows7系统.vue2.9.6版,DELL G3电脑. vue的插槽(slot)主要分三种: 默认插槽,具名插槽,作用域插槽 vue中的插槽,指的是子组件中提供给父组件使用的一个占位符: 用标签表示,父组件可以在这个占位符中填充任何模板代码,比如HTML.组件等,填充的内容会替换掉子组件的标签(替换占位符). 默认插槽 默认插槽是最简单的一种插槽,和上面的描述一致,就是通过替换占位符达到在父组件中更改子组件中内容的效果. 语法: 在子组件中放置一个占位符(slot): <

  • Asp.Net中索引器的用法分析

    本文实例分析了Asp.Net中索引器的用法.分享给大家供大家参考.具体如下: 索引器定义类似于属性,但其功能与属性并不相同.索引器提供一种特殊的方法编写get和set访问器.属性可以像访问字段一样访问对象的数据,索引器可以使用户像访问数组一样访问类成员. 一.索引器特性 1.get 访问器返回值.set 访问器分配值. 2.this 关键字用于定义索引器. 3.value 关键字用于定义由 set 索引器分配的值. 4.索引器不必根据整数值进行索引,由您决定如何定义特定的查找机制. 5.索引器可

  • JavaScript中的标签语句用法分析

    本文实例分析了JavaScript中的标签语句用法.分享给大家供大家参考.具体分析如下: 最近在看w3school,然后看到js部分, <!DOCTYPE html> <html> <body> <script> cars=["BMW","Volvo","Saab","Ford"]; list: { document.write(cars[0] + "<br>

  • thinkphp3.x中cookie方法的用法分析

    本文实例分析了thinkphp3.x中cookie方法的用法.分享给大家供大家参考,具体如下: 一.cookie函数也是一个多元化操作函数,完成cookie的设置.获取和删除操作. Cookie 用于Cookie 设置.获取.删除操作: 用法: cookie($name, $value='', $option=null) 参数: name(必须):要操作的cookie变量 value(可选):要设置的cookie值 option(可选):传入的cookie设置参数,默认为空 返回值 见详(根据具

  • PHP模板引擎Smarty中的保留变量用法分析

    本文实例讲述了PHP模板引擎Smarty中的保留变量用法.分享给大家供大家参考,具体如下: 在 Smarty 中,有一些保留变量,它们是不需要 PHP 脚本去分配就可以直接使用,即不用使用 $_tpl->assign('var','value') 去分配. 1.在模板中访问页面请求的变量 {$smarty.get.user} == $_GET['user'] {$smarty.post.user} == $_POST['user'] {$smarty.cookie.username} == $_

  • ThinkPHP中html:list标签用法分析

    本文实例分析了ThinkPHP中html:list标签用法.分享给大家供大家参考,具体如下: 复制代码 代码如下: <html:list id="checkList" name="user" style="list" checkbox="true" action="true" datasource="list" show="id:编号|8%,title:标题:edit,c

  • C#多线程之Thread中Thread.Join()函数用法分析

    本文实例讲述了C#多线程之Thread中Thread.Join()函数用法.分享给大家供大家参考.具体分析如下: Thread.Join()在MSDN中的解释:Blocks the calling thread until a thread terminates 当NewThread调用Join方法的时候,MainThread就被停止执行, 直到NewThread线程执行完毕. Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

  • JS中parseInt()和map()用法分析

    本文实例讲述了JS中parseInt()和map()用法.分享给大家供大家参考,具体如下: parseInt()的几个例子 var b = parseInt("01"); alert("b="+b); var c = parseInt("09/08/2009"); alert("c="+c); 结果:b=1,c=0 parseInt()用来解析字符串,返回整数,有几个特点: 1.无视被解析字符串最前和最后的空格,即:"

  • PHP中each与list用法分析

    本文实例分析了PHP中each与list用法.分享给大家供大家参考,具体如下: 1.each的用法 先看API array each ( array &$array ) api里是这么描述的:each - 返回数组中当前的键/值对并将数组指针向前移动一步 我们先来看看返回的数组是怎么样的? <?php $arr = array('你','若','安','好','便','是','晴','天'); print_r(each($arr)); print_r(each($arr)); echo '&

随机推荐