-1

There are several objects I have to add to a list that contain the same information—I would like to know a way how I can optimize the problem. See code below.

"GroupNumber" and "IsAvailable" are all going to be the same.

public class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hello World!");
        List<ClassA> listAs = new List<ClassA>();
        listAs.Add(new ClassA() {GroupNumber = 1, Name = "PersonA", IsAvailable = true});
        listAs.Add(new ClassA() {GroupNumber = 1, Name = "PersonB", IsAvailable = true});
        listAs.Add(new ClassA() {GroupNumber = 1, Name = "PersonC", IsAvailable = true});
    }
}

public class ClassA
{
  public int GroupNumber {get; set;}
  public string Name {get; set;}
  public bool IsAvailable {get; set;}
}

I want to know if there is a shortcut where I could add only "Name" with leaving "GroupNumber" and "IsAvailable" the same.

listAs.Add(new ClassA() {Name = "PersonA"});
listAs.Add(new ClassA() {Name = "PersonA"});
listAs.Add(new ClassA() {Name = "PersonA"});
Qma
  • 111
  • 1
  • 8

5 Answers5

4

No. But you can create a method which reduces the amount of duplication:

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    List<ClassA> listAs = new List<ClassA>()
    {
        CreateAvailablePerson("PersonA"),
        CreateAvailablePerson("PersonB"),
        CreateAvailablePerson("PersonC"),
    };
}

private static ClassA CreateAvailablePerson(string name)
{
    return new ClassA() { GroupNumber = 1, Name = name, IsAvailable = true };
}

If you're using C# 7.0+, you can use a local function to get rid of the extra class-level method

static void Main(string[] args)
{
    Console.WriteLine("Hello World!");
    List<ClassA> listAs = new List<ClassA>()
    {
        Create("PersonA"),
        Create("PersonB"),
        Create("PersonC"),
    };

    ClassA Create(string name) => new ClassA() { GroupNumber = 1, Name = name, IsAvailable = true };
}

If the default state for your ClassA is to be available, for example, you can also initialize it to true by default:

public class ClassA
{
    public int GroupNumber { get; set; }
    public string Name { get; set; }
    public bool IsAvailable { get; set; } = true;
}

Then you can do new ClassA() { GroupNumber = 1, Name = name }. You can of course also do this for GroupNumber, if its normal value is 1.

canton7
  • 37,633
  • 3
  • 64
  • 77
2

As an alternative to the other answers, use default arguments in your constructor:

public class ClassA
{
    public int GroupNumber {get; set;}
    public string Name {get; set;}
    public bool IsAvailable {get; set;}

    public ClassA(string name, int groupNumber = 1, bool isAvailable = true)
    {
        Name = name;
        GroupNumber = groupNumber;
        IsAvailable = isAvailable;
    }
}
Maximilian Burszley
  • 18,243
  • 4
  • 34
  • 63
1

Sure, you can create a constructor with 1 parameter, and set the other fields by default some value you desire.

 public ClassA (string name){
      GroupNumber = 100,
      Name = name,
      IsAvailable = true
}

if you want to have different GroupNumber values, initialize a static variable inside the class with some value, and in the constructor you will increment it.

Cata Hotea
  • 1,811
  • 1
  • 9
  • 19
1

Use a special class called 'factory' like this:

using System;
using System.Linq;

namespace Solution
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            var factory = new ClassAFactory(groupNumber: 1, isAvailable: true);
            var listAs = new[] { "PersonA", "PersonB", "PersonC" }
                               .Select(name => factory.CreateClassA(name))
                               .ToList();
        }
    }

    public class ClassA
    {
        public int GroupNumber { get; set; }
        public string Name { get; set; }
        public bool IsAvailable { get; set; }
    }

    public class ClassAFactory
    {
        private int GroupNumber { get; }
        public bool IsAvailable { get; }

        public ClassAFactory(int groupNumber, bool isAvailable)
        {
            GroupNumber = groupNumber;
            IsAvailable = isAvailable;
        }

        public ClassA CreateClassA(string name)
        {
            return new ClassA { GroupNumber = GroupNumber, Name = name, IsAvailable = IsAvailable };
        }
    }
}
CSDev
  • 3,177
  • 6
  • 19
  • 37
0

You can set a default value

public class ClassA
{
  public int GroupNumber {get; set;} = 1;
  public string Name {get; set;}
  public bool IsAvailable {get; set;} = true;
}
Dimitri
  • 110
  • 7
  • It will fork only for this 2 hard-coded values. If there is any change you should do the same as in question. – Roman Apr 09 '19 at 13:50