【问题标题】:Coalesce/IsNull functionality in LINQLINQ 中的合并/IsNull 功能
【发布时间】:2011-09-23 16:00:23
【问题描述】:

如果类中的属性满足特定条件,例如/为空,我如何使该属性返回特定字符串

public class Person
{
  public string Name{get;set;}
  publc string MiddleName{get;set;}
  public string Surname{get;set;}
  public string Gender{get;set;}
}

List<Person> people = repo.GetPeople();
List<Person> formatted = people.GroupBy(x=>x.Gender).//?? format Gender to be a certain string eg/"Not Defined" if blank 

【问题讨论】:

  • 可能不适用,但我有一个性别枚举,因为只有这么多选项。
  • 你是对的,但这只是一个例子,不是我的真实代码

标签: c# .net linq c#-4.0 .net-4.0


【解决方案1】:
people.GroupBy(x=>x.Gender ?? "Not Available").ToList();

更新:(捕获空字符串)

people.GroupBy(x=> String.IsNullOrWhiteSpace(x.Gender) ? "None" : x.Gender).ToList();

【讨论】:

    【解决方案2】:

    尝试这样的事情(我使用 int 作为属性类型):

    public class Widget
    {
      private int? MyPropertyBackingStore ;
      public int MyProperty
      {
        get
        {
          int value = 0 ; // the default value
          if ( this.MyPropertyBackingStore.HasValue && this.MyPropertyBackingStore > 0 )
          {
            value = this.MyPropertyBackingStore.Value ;
          }
          return value ;
        }
        set
        {
          this.MyPropertyBackingStore = value ;
        }
      }
    }
    

    或者,因为它是一个属性,所以控制如何/什么值被设置是微不足道的:只需在 settor 中调整属性值。

    public class Widget
    {
      private int MyPropertyBackingStore ;
      public int MyProperty
      {
        get
        {
          return this.MyPropertyBackingStore ;
        }
        set
        {
          if ( this.MyPropertyBackingStore.HasValue && this.MyPropertyBackingStore > 0 )
          {
            this.MyPropertyBackingStore = value ;
          }
          else
          {
            this.MyPropertyBackingStore = -1 ;
          }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      如果这是本地情况,我会用 ?? 修复 null在需要的地方。

      如果需要更通用的解决方案,我建议这样做。我打算直接在 getter(或 setter,如果需要)中修复它。

       private string _gender;
       public string Gender
       {
          get {
              string val = 
                 (!string.IsNullOrEmpty(_gender) ? _gender : "[Not decided yet]");
              return val; 
          }
          set { _gender = value; }
       }
      

      在整个测试示例程序中,

      public class Nullable
      {
          public class Person
          {
            private string _gender;
            public string Gender
            {
                get {
                    string val = 
                       (!string.IsNullOrEmpty(_gender) ? _gender : "[Not decided yet]");
                    return val; 
                }
                set { _gender = value; }
            }
      
            public string Name { get; set; }
            public string MiddleName { get; set; }
            public string Surname { get; set; }
          }
      
          static void Main()
          {
              List<Person> p = new List<Person>();
              p.Add(new Person() { Name = "John Doe", Gender = "Male" });
              p.Add(new Person() { Name = "Jane Doe", Gender = "Female" });
              p.Add(new Person() { Name = "Donna Doe", Gender = "Female" });
              p.Add(new Person() { Name = "UnDoe",  });
      
              // test 1
              foreach (var item in p.GroupBy(x => x.Gender))
                  Console.WriteLine(item.Count() + " " + item.Key);
      
              Console.WriteLine(Environment.NewLine);
      
              //test 2
              foreach (var item in p)
                  Console.WriteLine(item.Name + "\t" + item.Gender);
      
              Console.ReadLine();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-18
        • 2010-09-29
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多