如何维护对属性中旧值的引用

时间:2018-03-08 14:22:31

标签: c# list reference

我有两个变量,State和Address。 根据条件,State的值将= Address的值。我遇到的问题是保持对State的先前值的引用。如果情况发生变化,我将需要State的原始值。截至目前,我的应用程序无法维护对旧值的引用。

更多细节: 我正在处理的数据是与这些账户相关的账户和人员(财产:姓名,州,地址,电子邮件)。

数据显示在Matrix中,值取决于上述条件。条件是我们正在处理的账户。

当有一个帐户时,State的值将= Address的值。但是,如果有多个帐户,则State的值将是唯一的。

用户可以在4个帐户之间切换。一次可以设置多个帐户。

问题是,如果我正在处理单个帐户并且State值变为Address值,则我无法存储旧的State值。如果有多个帐户,将使用原始州值。但是,当我有多个帐户时,State值仍为=到Address值。这不太理想。

这就是我要找的:

实施例

原始数据= {" Ken," WA"," 123 St。"," Ken@email.com"}

单一帐户

Name State Address Email
"Ken" "WA" "WA"    "Ken@email.com"

多个帐户

 Name State Address Email
 "Ken" "WA" "123 St." "Ken@email.com"

然而,这就是我所得到的:

单一帐户 - 精细

Name State Address Email
"Ken" "WA" "WA"    "Ken@email.com"

多个帐户 - BAD

 Name State Address Email
 "Ken" "WA" "WA "Ken@email.com"

它不会使值重新循环

这是我的代码:

private void RefreshData()
{
  List<string> states = new List<string>();
  People.ForEach(p => states.Add(p.State)); // Attempting to stash current State vaues
  bool singleAccount = Accounts.Where(a => a.IsActive).Count() == 1;
  if (singleAccount)
  {
    int singleAccount = Accounts.IndexOf(Accounts.Where(a => a.IsActive).FirstOrDefault()) + 1; // Accounts are 1, 2, 3, or 4. I need the data for specific Account #s when a single Account
   AssignStateToAddress(states, singleAccount);
  }
  else
  {
    // Use the original values here, since there are multiple Accounts.
  }
 }


private void AssignStateToAddress(List<string> States, int singleAccount)
 {
   int position = 0;
   switch (singleAccount)
   {
     case 1: People.ForEach(p => p.Address1 = States[position++]);
      break;
     case 2: People.ForEach(p => p.Address2 = States[position++]);
      break;
     case 3: People.ForEach(p => p.Address3 = States[position++]);
      break;
     default: People.ForEach(p => p.Address4 = States[position++]);
      break;
    }
   }
  }
 }



}       

1 个答案:

答案 0 :(得分:0)

根据encapsulation的OOP概念,这类逻辑应该由你的People类在内部处理。有几种方法可以处理它,但最简单的方法是使Address成为一种理解所需行为的方法。

public class People
{
    public string State { get; set; }

    private string _address;

    public void SetAddress(string address)
        => _address = address;

    public void GetAddress(bool forSingleAccount)
        => forSingleAccount ? State : _address;
}

这种方式&#34;它只是工作&#34;当你拨打GetAddress时。

如果您确实需要Address作为属性(例如,用于序列化),那么您仍然可以通过向{添加IsSingleAccount布尔属性来封装行为。 {1}}并使People getter检查并返回一个值或另一个值。

Address

这种做法不像&#34;清洁&#34;因为public class People { public bool IsSingleAccount { get; set; } public string State { get; set; } private string _address; public string Address { set => _address = value; get => IsSingleAccount ? State : _address; } } 需要跟踪有关外部问题的信息,而您的消费代码需要采取额外步骤来更改所有实例上的该属性。这是一个设计问题的例子,被称为&#34;漏洞抽象&#34;。