wyszukiwanie elementow w List<DateTime>

Odpowiedz Nowy wątek
mefisto
2010-01-08 10:56
mefisto
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ć ?

Pozostało 580 znaków

msm
2010-01-08 16:06
msm
Administrator

Rejestracja: 10 lat temu

Ostatnio: 1 dzień temu

0

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.

.....

Pozostało 580 znaków

2010-01-08 16:24

Rejestracja: 16 lat temu

Ostatnio: 36 minut temu

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ń. :-)

Pozostało 580 znaków

2010-01-08 16:26

Rejestracja: 16 lat temu

Ostatnio: 36 minut temu

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.

Pozostało 580 znaków

2010-01-08 20:26

Rejestracja: 17 lat temu

Ostatnio: 4 lata temu

0

Nie starczy samo Except()?


Pozostało 580 znaków

2010-01-09 02:54

Rejestracja: 11 lat temu

Ostatnio: 7 lat temu

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")); });

Pozostało 580 znaków

Odpowiedz

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