如何在我正在迭代的列表中找到一个对象

时间:2013-05-02 17:10:20

标签: c# generics lambda

我正在迭代“prvEmployeeIncident”类型的对象列表。

该对象具有以下属性:

public DateTime DateOfIncident { get; set; }
public bool IsCountedAsAPoint; 
public decimal OriginalPointValue;
public bool IsFirstInCollection { get; set; }
public bool IsLastInCollection { get; set; }
public int PositionInCollection { get; set; }
public int DaysUntilNextPoint { get; set; }
public DateTime DateDroppedBySystem { get; set; }
public bool IsGoodBehaviorObject { get; set; }

我的列表按DateOfIncident属性排序。我想找到下一个对象向上列表,其中IsCounted == true并将其更改为IsCounted = false。

一个问题:

1)如何在列表中找到此对象?

3 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您可以使用LINQ FirstOrDefault

var nextObject = list.FirstOrDefault(x => x.IsCountedAsAPoint);

if (nextObject != null) 
    nextObject.IsCountedAsAPoint = false;

答案 1 :(得分:1)

如果我理解正确,这可以通过一个简单的foreach循环来解决。我并不完全理解你对“向上”的强调,因为你没有真正提出一个列表,你会遍历它。无论如何,以下代码片段找到IsCounted为true的第一个Incident,并将其更改为false。如果您从给定位置开始,请将每个循环更改为for循环,并从i = currentIndex开始,退出条件为i < MyList.Count。保留break语句以确保只修改一个Incident对象。

  foreach (prvEmployeeIncident inc in MyList)
  {
       if (inc.IsCountedAsAPoint)
       {
          inc.IsCountedAsAPoint = false;
          break;
       }
  }

答案 2 :(得分:0)

您可以使用List(T).FindIndex搜索列表。

示例:

public class Foo
{
    public Foo() { }

    public Foo(int item)
    {
        Item = item;
    }

    public int Item { get; set; }
}

var foos = new List<Foo>
                {
                    new Foo(1),
                    new Foo(2),
                    new Foo(3),
                    new Foo(4),
                    new Foo(5),
                    new Foo(6)
                };

foreach (var foo in foos)
{
    if(foo.Item == 3)
    {
        var startIndex = foos.IndexOf(foo) + 1;
        var matchedFooIndex = foos.FindIndex(startIndex, f => f.Item % 3 == 0);
        if(matchedFooIndex >= startIndex) // Make sure we found a match
            foos[matchedFooIndex].Item = 10;
    }
}

New collection

请确保您不会修改列表本身,因为这会引发异常。