各Fooにリストが含まれているリストがあります。
DateTimeリストの条件に基づいてListのアイテムをフィルタリングしたいと思います。たとえば、埋め込まれたリスト内で日時が重複しているすべてのFooアイテムを取得したいと思います。
私はいくつかのことを試みましたが、私の論理は私が達成しようとしていることの範囲内でわずかに欠陥があると思います。どんな助けでも大歓迎です。
ありがとう。
私はあなたがこのようなものを探していると信じています:
List<Foo> foos = new List<Foo>();
Random r = new Random();
for (int i = 0; i < 100; i++)
{
foos.Add(new Foo { Bar = DateTime.Now.Date.AddDays(r.Next(0, 365)) });
}
IList<Foo> filteredFoos = foos.Where(f1 => foos.Count(f2 => f2.Bar == f1.Bar) > 1).ToList();
Foo は次のようになります。
class Foo
{
public DateTime Bar { get; set; }
}
これはあなたを助けるかもしれません(アンドリューがすでに述べたように、あなたが持っている/必要なものを理解するのは難しいですが):
public class Foo
{
public Foo(IEnumerable<DateTime> dates)
{
this.Dates = new List<DateTime>(dates);
}
public IList<DateTime> Dates { get; private set; }
public static IEnumerable<Foo> FindFoos(IList<Foo> source)
{
return from f in source
where f.Dates.Distinct().Count() < f.Dates.Count
select f;
}
}
免責事項:まったく効率的ではありません。異なるデータ構造またはより洗練されたアルゴリズムを使用すると、速度が向上します。
試す
var duplicateDateFoos = foos.Where(foo => foo.DateTimes.GroupBy(d => d).Any(dateGroup => dateGroup.Count() > 1));
これにより、foo ごとに、DateTime のリストが DateTime 値でグループ化されます。特定の foo に対して、複数の項目を持つグループが存在する場合 (つまり、この foo の DateTimes の少なくとも 2 つのエントリが同じ値を持つ場合)、この foo は duplicateDateFoos リストに追加されます。