假设我们有一个列表{a,a,a,b,b,c,c}
我们希望遍历列表并在项目值更改时进行某种更改...例如:
prevEmployer = String.empty;
foreach(Person p in PersonList){
if(p.Employer != prevEmployer){
doSomething();
prevEmployer = p.Employer;
}
... more code
}
有替代方案吗?它看起来很狡猾。
编辑:使代码对于手头的问题更加真实。
答案 0 :(得分:5)
你想要不同的价值观吗?即会有{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;
}
}
}
答案 1 :(得分:3)
这实际上取决于您尝试对其余代码执行的操作。 @Marc Gravell的响应是正确的,如果你只需要为列表中的每个不同元素执行一个动作,但是,如果doSomething()只是基于list元素已经改变并且你正在对每个元素进行操作的事实来设置一些状态列表(或者需要用于其他目的的单个元素),那么你的方法看起来非常合理。
答案 2 :(得分:0)
只要String.Empty永远不是列表中的元素并且列表已排序,对我来说就很好看。可能希望确保该列表不会被其他某个线程变异。看起来像是处理列表中转换工作的漂亮股票方式......
答案 3 :(得分:0)
我决定使用以下解决方案,这个方案更漂亮但会导致更多数据库调用。
foreach(Employer employer in EmployerList){
ProcessEmployees(employer);
}
ProcessEmployees(Employer employer){
EmployeeList = GetEmployees(employer);
foreach(Employee employee in EmployeeList){
doStuff...
}
}
所以我不会以{a,a,a,b,b,c,c}开头,而是处理{a,a,a} {b,b} {c,c}