wyszukiwanie elementow w List<DateTime>

0

Witam.
Mam 2 listy typu List<DateTime> firstlist i secondlist w obu znajduja sie elementy chciałbym stworzyc 3 liste zawierajaca elementy z first list a nie znajduące się w secondlist. Daty powinny byc porownywane tylko dla formatu yyyy-mm-dd. Godzina jest nie istotna.

W jaki sposob mozna to zrobić ?

1

A jaki masz problem? Chcesz żeby w trzeciej liście były elementy które są w pierwszej a nie ma ich w drugiej?

for (int i = 0; i < lista1.Count; i++)
{
    if (lista1[i].rok == lista2[i].rok
        && lista1[i].miesiąc == lista2[i].miesiąc
        && lista1[i].dzień == lista2[i].dzień)
    lista3.Add(lista1[i]);
}

Jeśli chodzi o nazwy właściwości (no, "rok" to się na pewno nie nazywają - pisane z palca) to sam je łatwo znajdziesz - podstawowa znajomość angielskiego.

.....

0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    public class LambdaComparer<T> : IEqualityComparer<T>
    {
        private readonly Func<T, T, bool> _lambdaComparer;
        private readonly Func<T, int> _lambdaHash;

        public LambdaComparer(Func<T, T, bool> lambdaComparer) :
            this(lambdaComparer, o => o.GetHashCode())
        {
        }

        public LambdaComparer(Func<T, T, bool> lambdaComparer, Func<T, int> lambdaHash)
        {
            if (lambdaComparer == null)
                throw new ArgumentNullException("lambdaComparer");
            if (lambdaHash == null)
                throw new ArgumentNullException("lambdaHash");

            _lambdaComparer = lambdaComparer;
            _lambdaHash = lambdaHash;
        }

        public bool Equals(T x, T y)
        {
            return _lambdaComparer(x, y);
        }

        public int GetHashCode(T obj)
        {
            return _lambdaHash(obj);
        }
    }

  public static class IEnumerableExtension
  {
      public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, 
          IEnumerable<TSource> second , Func<TSource, TSource, bool> comparer )
      {
          return first.Except(second, new LambdaComparer<TSource>(comparer));
      }
  }

    class Program
    {
        static void Main(string[] args)
        {
            List<DateTime>
                firstlist = new List<DateTime>{
                   new DateTime(2009, 10, 5, 20, 15, 34),
                   new DateTime(2009, 10, 6, 20, 14, 34),
                   new DateTime(2009, 10, 7, 20, 16, 34),
                   new DateTime(2009, 10, 2, 20, 15, 34),
                   new DateTime(2009,  5, 5,  5,  5,  5)},
                secondlist = new List<DateTime>{
                   new DateTime(2009, 11, 5, 20, 15, 34),
                   new DateTime(2009, 10, 6, 22, 14, 34),
                   new DateTime(2009, 11, 7, 20, 16, 34),
                   new DateTime(2009, 10, 2, 20, 15, 34),
                   new DateTime(2009,  5, 5,  5,  5,  5)},
                thirdlist;
            thirdlist = (from dt in firstlist.Except(secondlist,(a,b) => a.Date==b.Date) select dt.Date).ToList();
            foreach (var d in thirdlist) Console.WriteLine(d);
        }
    }
}

Przepraszam, mam zły dzień. :-)

0
MSM napisał(a)

A jaki masz problem? Chcesz żeby w trzeciej liście były elementy które są w pierwszej a nie ma ich w drugiej?

for (int i = 0; i < lista1.Count; i++)
{
    if (lista1[i].rok == lista2[i].rok
        && lista1[i].miesiąc == lista2[i].miesiąc
        && lista1[i].dzień == lista2[i].dzień)
    lista3.Add(lista1[i]);
}

Przecież to nie zadziała. Muszą być dwa fory.

0

Nie starczy samo Except()?

0

Jeśli używasz .NET3.5 to możesz użyć:

List<DateTime> list0 = new List<DateTime>();
list0.Add(new DateTime(1999, 12, 24));
list0.Add(new DateTime(1998, 12, 24));
list0.Add(new DateTime(1997, 12, 24));
list0.Add(new DateTime(1996, 12, 24));
List<DateTime> list1 = new List<DateTime>();
list1.Add(new DateTime(1999, 12, 24));
list1.Add(new DateTime(1995, 12, 24));
list1.Add(new DateTime(1997, 12, 24));
list1.Add(new DateTime(1994, 12, 24));
foreach (DateTime dt in list0.Except<DateTime>(list1))
    Console.WriteLine(dt.ToString("yyyy-MM-dd"));

Wersja 2.0:

List<DateTime> list0 = new List<DateTime>();
list0.Add(new DateTime(1999, 10, 24));
list0.Add(new DateTime(1998, 10, 24));
list0.Add(new DateTime(1997, 10, 24));
list0.Add(new DateTime(1996, 10, 24));
List<DateTime> list1 = new List<DateTime>();
list1.Add(new DateTime(1999, 10, 24));
list1.Add(new DateTime(1995, 10, 24));
list1.Add(new DateTime(1997, 10, 24));
list1.Add(new DateTime(1994, 10, 24));
List<DateTime> list2 = new List<DateTime>();
foreach (DateTime item in list0)
    if (list1.Find(delegate(DateTime data) { return item.ToString("yyyy-MM-dd").Equals(data.ToString("yyyy-MM-dd")); }) == new DateTime())
        list2.Add(item);
list2.ForEach(delegate(DateTime item) { Console.WriteLine(item.ToString("yyyy-MM-dd")); });

1 użytkowników online, w tym zalogowanych: 0, gości: 1