使用String.Split的替代方法

时间:2012-05-03 18:09:45

标签: c# linq

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

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

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

7 个答案:

答案 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();