下面的代码查找由逗号分隔的电子邮件组成的字符串,如果它不在结果集合中,也会添加一个电子邮件,也是字符串类型。
string [] oEmails=orderEmails.Split(',');
string[] partEmails= part[Constants.Emails].ToString().Split(',');
foreach(string email in oEmails)
{
if(!partEmails.Contains(email))
{
part[Constants.Emails] += "," + email;
}
}
这是编写此逻辑的最佳方法吗?我工作正常,但我想知道是否有一种方法可以将这个逻辑合并为一个lambda表达式?
困扰我的是我对这些数组没有做任何事情,但是拆分了输入字符串。他们没有其他目的。
答案 0 :(得分:3)
part[Constants.Emails] =
string.Join(",", part[Constants.Emails].Split(',').Union(orderEmails.Split(',')).ToArray());
除此之外,您以错误的方式存储电子邮件。不要将它们存储为逗号分隔的字符串,将它们存储为List。这样,每次修改“集合”时都不需要解析它们。
答案 1 :(得分:3)
您可以使用HashSet
代替单个string
吗?如果列表中尚不存在该值,则只会向列表中添加值。 E.g。
part[Constants.Emails] = new HashSet<string>();
foreach (var email in oEmails)
part[Constants.Emails].Add(email);
如果您需要更轻松地与一个大字符串进行转换,您可以创建一个类,例如
class Emails : HashSet<string>
{
public Emails(string concatenatedList)
: base(concatenatedList.Split(','))
{
}
public override string ToString()
{
return string.Join(",", this);
}
}
答案 2 :(得分:0)
part[Constant.Emails] += oEmails.Where(email => !partEmails.Contains(email))
.Aggregate(b, (current, email)
=> current + ("," + email));
首先,这会选择尚未存在的电子邮件(第一行),然后将它们聚合为一些,mail
部分(第二行和第三行)的字符串。然后它将它添加回字符串(第一行)。
答案 3 :(得分:0)
这样可以通过直接在字符串中执行查找来避免part[Constants.Emails].Split(',')
:
string[] oEmails = orderEmails.Split(',');
string partEmails = part[Constants.Emails];
foreach (string email in oEmails)
{
bool index = partEmails.IndexOf(email);
bool isAlreadyPresent = index != -1 &&
(index == 0 || partEmails[index - 1] == ',') &&
(index + email.Length == partEmails.Length || partEmails[index + 1] == ',');
if (!isAlreadyPresent)
{
partEmails += "," + email;
}
}
part[Constants.Emails] = partEmails;
答案 4 :(得分:0)
试试这个:
part[Constants.Emails] = string.Join( ",", (
from e in (part[Constants.Emails].ToString() + "," + orderEmails).Split(',')
where !string.IsNullOrEmpty( e )
select e
).Distinct().ToArray() );
它的可读性较差,但运行速度可能更快。
编辑:大多数其他解决方案(包括问题)都使用字符串连接。 StringBuilder对此更好。
编辑:将此数据存储为List或哈希表要比将结果数组/列表合并为逗号分隔的字符串并每次解析它都要好得多,更不用说获取错误的答案,如果你的一个字符串中有一个合法的逗号。
答案 5 :(得分:0)
你应该能够巩固这样的逻辑:
oEmails.Where(partEmails.Contains).Select(e => partEmails[Constants.Emails] += string.Format(",{0}", e));
答案 6 :(得分:0)
也许你可以试试
var result = oEmails.Select((x, i) => oEmails[i] == partEmails[i] ? part[Constants.Emails] :
partEmails.Contains(x) ? part[Constants.Emails] : -1).ToArray();