如何拆分字符串并将每个项目分别添加到字典?

时间:2017-10-24 14:54:12

标签: c# .net

我需要拆分一个包含逗号连接的电子邮件的字符串。 例如:

  

EMAIL1 @ gmail.com,EMAIL2 @ gmail.com,EMAIL3 @ gmail.com,

分割字符串并将其添加到字典的方法:

public Dictionary<string[], string[]> GetMail(int id)
{
    var email = db.table1.ToList()
                .Where(r => r.idTable == id)
                .Select(em => em.email.Split(','));

    var dictionary = new Dictionary<string[], string[]>();

    foreach (var mail in email)
        dictionary.Add(mail,mail);

    return dictionary;
}

但是我需要在不同的索引中添加每个索引,因为结果是:

[0] "email1@gmail.com,email2@gmail.com,email3@gmail.com"

result obtained by GetMail () method

我需要的是这样的事情:

[0] "email1@gmail.com"
[1] "email2@gmail.com"
[2] "email3@gmail.com"

有可能这样做吗?我该怎么做?

4 个答案:

答案 0 :(得分:3)

看来,你想要这样的东西(如果你坚持Dictionary):

// Dictionary<int, string>:
//   Key   - int    - index
//   Value - string - eMail
public Dictionary<int, string> GetMail(int id) {
  var result = db.table1
    .AsEnumerable()                              // Do not materialize prematurely
    .Where(row => row.idTable == id)               
    .SelectMany(row => row.email.Split(','))     // flatten sequence
    .Select((email, index) => new {              // key and value specifictaion
       key = index,
       email = email })  
    .ToDictionary(pair => pair.key,              // final dictionary 
                  pair => pair.email); 
}

Dictionary在问题的上下文中是多余的:数组将提供相同的功能:dict[key]array[index]

public string[] GetMail(int id) {
  var result = db.table1
    .AsEnumerable()                              // Do not materialize prematurely
    .Where(row => row.idTable == id)               
    .SelectMany(row => row.email.Split(','))     // flatten sequence
//  .Distinct() // if you want distinct eMails only  
    .ToArray(); 
}

答案 1 :(得分:2)

如果键和值相同,则使用字典没有意义。使用

更简单
HashSet<string>

答案 2 :(得分:0)

        string emails = "email1@gmail.com,email2@gmial.com,email3@gmail.com";
        Dictionary<int, string> dictEmails = new Dictionary<int, string>();
        string[] arrEmails = emails.Split(',');
        for (int i = 0; i < arrEmails.Length; i++)
        {
            dictEmails.Add(i, arrEmails[i]);
        }

答案 3 :(得分:0)

感谢大家的回复,我使用SelectMany代替Select解决了问题(老实说,我不知道这种方法)。

public Dictionary<string, string> GetMail(int id)
{
    var email = db.table1.ToList()
                .Where(r => r.idTable == id)
                 //SelectMany instead of Select
                .SelectMany(em => em.email.Split(','));

    var dictionary = new Dictionary<string, string>();

    foreach (var mail in email)
        dictionary.Add(mail,mail);

    return dictionary;
    //this returns:
    //[0]{[email1@gmail.com, email1@gmail.com]}
    //[1]{[email2@gmail.com, email2@gmail.com]}
    //[2]{[email3@gmail.com, email3@gmail.com]}
}

使用字典有什么意义?

这是我正在开发的应用程序的要求,想法是使用键/值在TokenBox中使用,无论密钥和值是否相同(可以是在将来更改)例如用户名电子邮件

我看不到您的屏幕截图

我道歉,我认为这是因为我在stackoverflow上没有足够的点来附加图像:(