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