LINQ查询检查列表中的相同日期?

时间:2017-11-13 11:01:13

标签: c# linq

我有一个列表复杂对象itemofsamestartDate表示它有itemofsamestartDate[0],itemofsamestartDate[1],itemofsamestartDate[2]....等等。 itemofsamestartDate [i]具有startDate属性。如果所有列表具有相同的开始日期,我想写一个LINQ查询以返回True

在查询下方,我试过了 -

var itemofsamestartDate = from aIndex in Enumerable.Range(0, itemOfSinglePrority.Count())
       from b in itemOfSinglePrority.Skip(aIndex + 1)
       let a = itemOfSinglePrority.ElementAt(aIndex)
       where a != b && a.StartDate == b.StartDate
       select new
       {
            object1 = a,
            object2 = b
       };

现在我正在检查itemofsamestartDate计数是否大于0,然后它具有相同的开始日期,但如果我的列表数仅为2,则上述工作正常,即itemofsamestartDate [0]& itemofsamestartDate [1]。

LINQ查询应该检查列表是否具有相同的startdata(DateTime数据类型)。

2 个答案:

答案 0 :(得分:0)

检查这一点的可读方式可以是:

bool allEqual=false;

if(itemofsamestartDate != null && itemofsamestartDate.Count()>0) {
    int countEqual = itemofsamestartDate
        .Count(x => x.StartDate == itemofsamestartDate[0].StartDate);
    int count = itemofsamestartDate.Count();

    allEqual = countEqual == count;
}

一种不太可读的方式:

bool allEqual=false;
if(itemofsamestartDate != null && itemofsamestartDate.Count()>0)
    allEqual = itemofsamestartDate.Count(x => x.StartDate == itemofsamestartDate[0].StartDate) == itemofsamestartDate.Count(); 

您还可以按StartDate对列表进行分组,然后检查是否只有一个组。

答案 1 :(得分:0)

类ItemOfStartDate具有属性StartDate。 您有此类的一系列对象,并且您想知道此序列中的所有对象是否具有相同的StartDate值。

换句话说,您想知道StartDate是否只有一个值。

如果序列为空,你没有提到你想要的东西。我们假设空列表中的所有StartDates都相等

IEnumerable<ItemOfStartDate> myItems = ...
bool onlyOneStartDates = !myItems    // from every element in my sequence
   .Select(item => item.StartDate)  // take the value of StartDate
   .Distinct();                     // and remove duplicates
   .Skip(1)
   .Any();                          // true if we have more than 1 left

如果您想更频繁地检查唯一性,请考虑创建扩展方法:

static class EnumerableExtensions
{
    public static bool IsUnique<TSource, TKey>(this TSource source, 
        Func<TSource, TKey> propertySelector)
    {
         return !source.Select(propertySelector)
             .Distinct()
             .Skip(1)
             .Any();
    }
}

用法:

IEnumerable<ItemOfStartDate> myItems = ...
bool onlyOneStartDates = IsUnique(item => item.StartDate);

如果需要,您可以添加一个重载IEqualityComparer以在Distinct

中使用