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;
  }
}

これは、このロジックを記述するための最良のアプローチですか? 私は正常に動作しますが、このロジックをラムダ式に統合できる方法があるかどうか疑問に思っていましたか?

私を悩ませているのは、これらの配列で何もせず、入力文字列を分割していることです。それ以外の目的はありません。

4

7 に答える 7

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

それに加えて、メールを間違った方法で保存しています。コンマ区切りの文字列として保存せず、リストとして保存してください。そうすれば、「コレクション」を変更するたびにそれらを解析する必要がなくなります。

于 2012-05-03T18:16:43.833 に答える
3

HashSet単一の大きなの代わりに を使用できますstringか? リストに値が存在しない場合にのみ、リストに値が追加されます。例えば

part[Constants.Emails] = new HashSet<string>();
foreach (var email in oEmails)
    part[Constants.Emails].Add(email);

1 つの大きな文字列との間の簡単な変換が必要な場合は、クラスを作成できます。

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の部分からなる文字列にそれらを集約します (2 行目と 3 行目)。次に、それを文字列に追加します (最初の行)。

于 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() );

可読性は低くなりますが、おそらくはるかに高速に実行されます。

EDIT:他のほとんどのソリューション(質問を含む)は文字列連結を使用しています。StringBuilder は、これに対してはるかに優れています。

編集:このデータをリストまたはハッシュテーブルとして保存することは、結果の配列/リストをコンマ区切りの文字列に連結し、毎回それを解析するよりもはるかに優れています。文字列の1つに正当なその中にコンマ。

于 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 に答える