0

下面的代码在一个由逗号分隔的电子邮件组成的字符串中查找,如果它不在结果集合中,则添加一个电子邮件,该集合也是字符串类型。

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 表达式中?

困扰我的是我没有对这些数组做任何事情,而是拆分输入字符串。它们没有其他用途。

4

7 回答 7

3
part[Constants.Emails] =
 string.Join(",", part[Constants.Emails].Split(',').Union(orderEmails.Split(',')).ToArray());

除此之外,您以错误的方式存储电子邮件。不要将它们存储为逗号分隔的字符串,将它们存储为列表。这样您就不必在每次修改“集合”时解析它们。

于 2012-05-03T18:16:43.833 回答
3

您可以使用 aHashSet而不是单个 largestring吗?如果列表中尚不存在值,这只会将值添加到列表中。例如

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);
    }
}
于 2012-05-03T18:19:45.980 回答
0
part[Constant.Emails] += oEmails.Where(email => !partEmails.Contains(email))
                                .Aggregate(b, (current, email)
                                              => current + ("," + email));

首先,这会选择尚未出现的电子邮件(第一行),然后将它们聚合成一个由几,mail部分组成的字符串(第二行和第三行)。然后它将它添加回字符串(第一行)。

于 2012-05-03T18:16:36.207 回答
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;
于 2012-05-03T18:19:20.523 回答
0

试试这个:

part[Constants.Emails] = string.Join( ",", ( 
    from e in (part[Constants.Emails].ToString() + "," +  orderEmails).Split(',')
    where !string.IsNullOrEmpty( e )
    select e 
).Distinct().ToArray() );

它的可读性较差,但可能运行得更快。

编辑:大多数其他解决方案(包括问题)使用字符串连接。StringBuilder 对此要好得多。

编辑:将此数据存储为列表或哈希表比将生成的数组/列表连接成逗号分隔的字符串并每次都将其解析出来要好得多,如果您的一个字符串有合法的答案,请不要说得到错误的答案逗号在里面。

于 2012-05-03T18:20:38.713 回答
0

您应该能够像这样整合逻辑:

oEmails.Where(partEmails.Contains).Select(e => partEmails[Constants.Emails] += string.Format(",{0}", e));
于 2012-05-03T18:23:26.533 回答
0

也许你可以试试


var result = oEmails.Select((x, i) => oEmails[i] == partEmails[i] ? part[Constants.Emails] :
             partEmails.Contains(x) ? part[Constants.Emails] : -1).ToArray();

于 2012-05-03T18:25:58.257 回答