我有两个变量,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;
}
}
}
}
}
答案 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;。