Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用C#/LINQ多次从单词中提取字母_C#_Linq_Loops_Active Directory_Automation - Fatal编程技术网

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

如何使用C#/LINQ多次从单词中提取字母,c#,linq,loops,active-directory,automation,C#,Linq,Loops,Active Directory,Automation,因此,我目前正试图为我工作的公司创建一个广告自动化程序,但我在名字方面遇到了问题。首先,我抓取了他们的名字和电子邮件的最后一个首字母,但我不知道如何抓取另一个数字,如果该帐户已经存在 前。JohnS@contoso.com已经存在,另一位同名的先生为我们工作,所以我需要创建。 前任。JohnSm@contoso.com 我试着用这个例子,但效果不太好。 我循环程序的这一部分来检查已经创建的用户,如果它在那里,那么它将添加另一个字母等等,直到用户被创建。谢谢你的帮助 编辑:对不起,英语不是我的第

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

前。JohnS@contoso.com已经存在,另一位同名的先生为我们工作,所以我需要创建。 前任。JohnSm@contoso.com

我试着用这个例子,但效果不太好。

我循环程序的这一部分来检查已经创建的用户,如果它在那里,那么它将添加另一个字母等等,直到用户被创建。谢谢你的帮助

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

我的源代码现在这个小部分,这是给我一个头痛哈哈

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

        }
    }
类程序
{
静态void Main(字符串[]参数)
{
列表列表=新列表();
使用(var context=new miEntities())
{
theList=context.utables.Where(o=>o.Date==null&&o.Department==“IS”).ToList();
}
foreach(列表中的utable id)
{
字符串Fname=id.Fname;
字符串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.lntomame.Length+1)。tring());
Console.WriteLine(string.Join(“,username));
Console.ReadKey();
}
}

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

两分钟的回答如下:

    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));
    }
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));
        }
    }
}
这将提供以下输出:

JohnS WillS JohnSm
唯一有趣的一行是分配给
用户名
,这是一个单行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() : ""));

这似乎行得通。我认为您不会有姓氏字母用完的问题,因为order by应该将姓氏较短的人放在第一位

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;
})
列表名称=新列表()
{
新字符串[]{“Jason”,“Boyd”},
新字符串[]{“Jason”,“Boyle”},
新字符串[]{“Jason”,“Bower”},
新字符串[]{“John”,“Smith”},
新字符串[]{“Will”,“Smith”},
新字符串[]{“John”,“Smith”}
};
名字
.OrderBy(x=>x[0])
.ThenBy(x=>x[1])
.Aggregate(新列表(),(acc,x)=>
{
//附加名字。
字符串温度=x[0];
//附加姓氏的第一个字符。
温度+=x[1][0];
//如果累加器还没有名称,则添加“temp”并继续。
如果(acc.Count==0)
{
附件添加(温度);
}
其他的
{
//如果累加器有名称,则构造一个新名称
//将姓氏中的字符添加到“temp”中,直到
//“temp”与累加器中的姓氏不匹配。
字符串lastEntry=acc.Last();
int指数=1;
while(lastEntry.IndexOf(temp,0,StringComparison.InvariantCultureIgnoreCase)>=0)
{
温度+=x[1][指数];
索引++;
}
//将“温度”添加到蓄能器中。
附件添加(温度);
}
返回acc;
})

考虑以下情况:

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

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

您可以添加一些关于它为什么不起作用、您得到了什么或者您已经尝试过的疑难解答的内容吗?包含代码片段也会很有帮助这并不是你所期望的。你能给我们展示一下数据外观的例子吗?它是否受监管(即一致分隔)?你们当前的代码是什么样子的?我把我的代码放上去了,谢谢你们!如果你们不介意的话,我发布了源代码。我试图使用你们的最后一点,但没有得到任何回报。我可能用错了。为什么它在for循环中?它已经是整个列表的迭代器了。