C# 整个If值!=循环中的值
假设我们有一个列表{a,a,b,b,c,c} 我们希望循环浏览列表,并在项目值更改时进行某种更改。。。例如:C# 整个If值!=循环中的值,c#,loops,list,C#,Loops,List,假设我们有一个列表{a,a,b,b,c,c} 我们希望循环浏览列表,并在项目值更改时进行某种更改。。。例如: prevEmployer = String.empty; foreach(Person p in PersonList){ if(p.Employer != prevEmployer){ doSomething(); prevEmployer = p.Employer; } ... more code } 除此之外还有其他选择吗?我只是觉得它不太清楚 编
prevEmployer = String.empty;
foreach(Person p in PersonList){
if(p.Employer != prevEmployer){
doSomething();
prevEmployer = p.Employer;
}
... more code
}
除此之外还有其他选择吗?我只是觉得它不太清楚
编辑:使代码更符合当前问题。是否需要不同的值?i、 会有{a,a,a,b,b,a,c,c,a}吗?如果没有,您可以使用LINQ:
foreach(string s in theList.Distinct()) {
doSomething(); // with s
}
重新更新;也许可以使用类似于
DistinctBy
:
foreach(var item in data.DistinctBy(x=>x.Foo)) {
Console.WriteLine(item.Bar);
}
public static IEnumerable<TSource> DistinctBy<TSource,TValue>(
this IEnumerable<TSource> source, Func<TSource,TValue> selector) {
var set = new HashSet<TValue>();
foreach (var item in source) {
if (set.Add(selector(item))) {
yield return item;
}
}
}
foreach(data.DistinctBy(x=>x.Foo)中的变量项){
控制台写入线(条);
}
公共静态IEnumerable DistinctBy(
此IEnumerable源(函数选择器){
var set=新的HashSet();
foreach(源中的var项){
if(set.Add(选择器(项))){
收益回报项目;
}
}
}
只要字符串长,我就觉得不错。空永远不是列表中的元素,并且列表已排序。可能需要确保该列表不会被其他线程变异。看起来是处理列表中转换工作的一种非常简单的方法…这实际上取决于您对其余代码的处理方式@Marc Gravell的回答是正确的,如果您只需要对列表中的每个不同元素执行操作,但是如果doSomething()只是根据列表元素已更改的事实设置了一些状态,并且您正在对列表中的每个元素进行操作(或者出于其他目的需要单独的元素),然后,您的方法看起来非常合理。我决定采用以下解决方案,它更漂亮,但会导致更多的db调用
foreach(Employer employer in EmployerList){
ProcessEmployees(employer);
}
ProcessEmployees(Employer employer){
EmployeeList = GetEmployees(employer);
foreach(Employee employee in EmployeeList){
doStuff...
}
}
因此,不是从{a,a,b,b,c,c}开始,我将处理{a,a,a}{b,b}{c,c}对不起,我应该澄清一下-我不想要不同的值。这是一个非常简单的例子,我实际上是在比较循环中某个对象的属性(它是按该属性排序的),我需要对列表中的每个项目执行操作,但当对象的某个属性发生更改时,需要重新初始化某些内容。我认为简单、笨拙的方法可能是最好的。你知道你可以用:foreach(EmployeeList.GroupBy(employee=>employee.Employer)foreach(employeeGroup中的var employeeGroup)内部foreach循环遍历雇主中的所有员工。employeeGroup。关键是我不知道GroupBy的员工-这很好。我认为这解决了我最初的问题,而没有我最终进行的重构。我现在必须尝试:)哦,这是一个LINQ的东西。我还没准备好在周五下午3点把LINQ扔进代码库。作为参考,MSDN上有一个不错的例子: