Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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# 整个If值!=循环中的值_C#_Loops_List - Fatal编程技术网

C# 整个If值!=循环中的值

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 } 除此之外还有其他选择吗?我只是觉得它不太清楚 编

假设我们有一个列表{a,a,b,b,c,c}

我们希望循环浏览列表,并在项目值更改时进行某种更改。。。例如:

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上有一个不错的例子: