如何使用C#/ LINQ多次从单词中抓取字母

时间:2015-04-15 17:18:51

标签: c# linq loops active-directory automation

因此,我正在尝试为我工作的公司创建一个AD自动化程序,但我遇到了名称问题。首先,我正在为他们的电子邮件抓住他们的名字和最后一个首字母,但如果该帐户已经存在,我不知道如何获取另一个数字。

实施例。 JohnS@contoso.com已经存在,另一位同名的绅士为我们工作,所以我需要创建。 防爆。 JohnSm@contoso.com

我试图使用这个例子,但它没有成功。 How to extract first letters from different words in a string in c#

我正在循环程序的这一部分以检查已经创建的用户,如果它在那里它将添加另一个字母,依此类推,直到用户被创建。 TY的帮助!

编辑:对不起英语不是我的第一语言。

我的源代码现在这个小部分让我头疼大声笑。

class Program
{
    static void Main(string[] args)
    {
        List<utable> theList = new List<utable>();
        using (var context = new miEntities())
        {
            theList = context.utables.Where(o => o.Date == null && o.Department == "IS").ToList();

        }
        foreach (utable id in theList)
        {

            string Fname = id.Fname;
            string Lname = id.lname;
            var username = theList.Select((u, i) => new { u.lname, u.Fname, Len = theList.Take(i - 1).Count(iu => iu.Fname == u.Fname && iu.lname == u.lname) + 1 }).Select(u => u.Fname + u.lname.Substring(0, Math.Min(u.Len, u.lname.Length)) + (u.Len >= u.lname.Length ? (u.Len - u.lname.Length + 1).ToString() : ""));
            Console.WriteLine(string.Join(" ", username));
            Console.ReadKey();

        }
    }

我现在有控制台推送,所以我可以看到它拉动了什么,但即使我在数据库中的要求存在,我也什么都不拉。尝试使用你们已经列出的一些代码。

3 个答案:

答案 0 :(得分:0)

2分钟的回答是这样的:

    class User
    {
        public string FName, LName;
        public User(string fname, string lname) { FName = fname; LName = lname; }
    }

    static void Main(string[] args)
    {
        var lst = new[] { new User("John", "Smith"), new User("Will", "Smith"), new User("John", "Smith") };
        var usernames = lst.Select((u, i) => u.FName + u.LName.Substring(0, lst.Take(i - 1).Count(iu => iu.FName == u.FName && iu.LName == u.LName) + 1));
        Console.WriteLine(string.Join(" ", usernames));
    }

这给出了以下输出:

JohnS WillS JohnSm

唯一有趣的一行是对usernames的赋值,这是一个单行Linq语句,对于每个元素,它计算了多少以前的元素(基于当前索引)共享第一个和使用当前名称的姓氏,并从姓氏中取出(Take<>())该字符数量(+1,因此您总是至少有一个)并将其附加到名字。

这显然只有在姓氏中有足够的字符才有效,否则会引发异常。简单的解决方法是开始附加数字 - 只需将计数减去名称中的字符数作为字符串。称之为功课!

编辑:感到无聊,这里也是附加数字的版本:

        var usernames = lst.Select((u, i) => new { u.LName, u.FName, Len = lst.Take(i - 1).Count(iu => iu.FName == u.FName && iu.LName == u.LName) + 1 })
            .Select(u => u.FName + u.LName.Substring(0, Math.Min(u.Len, u.LName.Length)) + (u.Len >= u.LName.Length ? (u.Len - u.LName.Length + 1).ToString() : ""));

答案 1 :(得分:0)

这似乎有效。我不认为你的姓氏用完就会出现问题,因为订单应该首先放置姓氏较短的人。

List<string[]> names = new List<string[]>()
{
    new string[] { "Jason", "Boyd" },
    new string[] { "Jason", "Boyle"},
    new string[] { "Jason", "Bower"},
    new string[] { "John", "Smith" },
    new string[] { "Will", "Smith"},
    new string[] { "John", "Smith"}
};

names
.OrderBy(x => x[0])
.ThenBy(x => x[1])
.Aggregate(new List<string>(), (acc, x) => 
{
    // Append first name.
    string temp = x[0];

    // Append the first character of the last name.
    temp += x[1][0];

    // If the accumulator has no names yet then add 'temp' and move on.
    if(acc.Count == 0)
    {
        acc.Add(temp);
    }
    else
    {
        // If the accumulator has names then construct a new name
        // by adding characters from the last name to 'temp' until
        // 'temp' does not match the last name in the accumulator.
        string lastEntry = acc.Last();
        int index = 1;
        while(lastEntry.IndexOf(temp, 0, StringComparison.InvariantCultureIgnoreCase) >= 0)
        {
            temp += x[1][index];
            index++;
        }

        // Add 'temp' to the accumulator.
        acc.Add(temp);
    }

    return acc;
})

答案 2 :(得分:0)

考虑这样的事情:

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }

    public IEnumerable<string> GenerateEmails()
    {
        for (int i = 0; i < LastName.Length; i++)
        {
            yield return String.Format("{0}{1}@domain.com", FirstName, LastName.Substring(0, i+1));
        }
    }
}

GenerateEmails方法为您提供了电子邮件候选,您可以使用它来与注册用户列表进行比较,如下所示:

public class Program
{
    static void Main()
    {
        User user = CreateUser("jhon", "smik");
        Console.WriteLine(user.Email);
    }

    static User CreateUser(string firstName, string lastName)
    {
        User user = new User { FirstName = firstName, LastName = lastName };
        var registeredUsers = GetSampleUsers();

        foreach (string email in user.GenerateEmails())
        {
            if (!registeredUsers.Any(u => u.Email.Equals(email)))
            {
                user.Email = email;
                break;
            }
        }
        return user;
    }

    static List<User> GetSampleUsers()
    {
        return new List<User>
        {
            new User { FirstName = "jhon", LastName = "smith", Email = "jhon@domain.com" },
            new User { FirstName = "jhon", LastName = "sack", Email = "jhons@domain.com" },
            new User { FirstName = "jhon", LastName = "samuelson", Email = "jhonsa@domain.com" }
        };
    }

}

CreateUser方法会创建一个新的User对象,并尝试使用唯一的电子邮件初始化其Email属性。