2015-04-01 75 views
1

的前一個元素,我有一個像我如何得到一個列表<T>

var myList = new List<object> { 
    new { Day = "Sunday", ID = 15 }, 
    new { Day = "Monday", ID = 20 }, 
    new { Day = "Tuesday", ID = 80 } 
}; 

列表現在我想獲得一個給定的ID的前一天。 例如到週一和週日的80個導致應該是20的結果。該列表按照ID排序!

有沒有一種簡單的方法來確定日值?理想將是一個linq解決方案。

+7

如何使用[LinkedList](https://msdn.microsoft.com/en-us/library/he2s3bh7(v = vs.110).aspx)。 – 2015-04-01 09:46:12

回答

6
var result = myList.LastOrDefault(item => item.ID < 80); 
0
var item = myList.Single(l => l.ID == 80); 
var i = myList.IndexOf(item); 
var j = (i - 1) % myList.Count; 

var prevItem = myList[j]; 

這將讓你要搜索的項目,找到它的指數在列表中,減去一個(模可以讓你以環繞列表的末尾),然後通過索引從列表中獲取前一個項目。

編輯:使用索引而不是像FindLast之類的東西,可以讓您不需要ID值與日期升序。例如星期一可能是100和星期二15,這不會有什麼不同。

1
myList.TakeWhile(o => o.ID <= givenID).Select(o => o.Day).LastOrDefault(); 

這是假定myList是有序的。否則,你可以扔在一個OrderBy()

0

不要使用varobject。試試這個:

private class ItemList 
{ 

    /// <summary> 
    /// Day 
    /// </summary> 
    public string Day { get; set; } 

    /// <summary> 
    /// ID 
    /// </summary> 
    public int ID { get; set; } 

} 

和:

List<ItemList> myList = new List<ItemList> { 
    new ItemList() { Day="S", ID=10 }, 
    new ItemList() { Day="M", ID=20 }, 
    new ItemList() { Day="T", ID=30 }, 
}; 

foreach(ItemList key in myList) 
{ 
    ItemList result = myList.FindLast(x=>x.ID<key.ID); 
    if(result!=null) 
    { 
     MessageBox.Show("Prev ID: " + result.ID.ToString()); 
    } 
} 
0

(上Calculate difference from previous item with LINQ開始),純LINQ的方式找到分組值

var value = myList.SelectWithPrevious((prev, cur) => new { prev = prev, cur= cur}).Where((w) => w.cur.ID == 80).First(); 
      Console.WriteLine(value.prev.Day); 

擴展

public static IEnumerable<TResult> SelectWithPrevious<TSource, TResult> (this IEnumerable<TSource> source,Func<TSource, TSource, TResult> projection) 
{ 
    using (var iterator = source.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
     { 
      yield break; 
     } 
     TSource previous = iterator.Current; 
     while (iterator.MoveNext()) 
     { 
      yield return projection(previous, iterator.Current); 
      previous = iterator.Current; 
     } 
    } 
} 

這確實給你比你需要的更多。但是,它可能在未來有所幫助。

相關問題