Функциональность Coalesce / IsNull в LINQ - PullRequest
2 голосов
/ 23 сентября 2011

Как сделать так, чтобы свойство в классе возвращало определенную строку, если это определенное условие, например / empty

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 

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011
people.GroupBy(x=>x.Gender ?? "Not Available").ToList();

Обновление: (чтобы ловить пустые строки)

people.GroupBy(x=> String.IsNullOrWhiteSpace(x.Gender) ? "None" : x.Gender).ToList();
0 голосов
/ 23 сентября 2011

Попробуйте что-то вроде этого (я использую 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 ;
    }
  }
}

Или, поскольку это свойство, поэтому легко контролировать, как / какие значения устанавливаются: просто настройтезначение свойства в сеттере.

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 ;
      }
    }
  }
}
0 голосов
/ 23 сентября 2011

Если бы это была локальная ситуация, я бы исправил ноль с помощью ?? в месте, где это необходимо.

Если требуется более общее решение, которое я рекомендую. Я должен был починить его прямо в геттере (или, если хотите, в сеттере).

 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...