using System;
using System.Collections.Generic;
namespace MediaBrowser.Model.Extensions
{
// MoreLINQ - Extensions to LINQ to Objects
// Copyright (c) 2008 Jonathan Skeet. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
public static class LinqExtensions
{
///
/// Returns all distinct elements of the given source, where "distinctness"
/// is determined via a projection and the default equality comparer for the projected type.
///
///
/// This operator uses deferred execution and streams the results, although
/// a set of already-seen keys is retained. If a key is seen multiple times,
/// only the first element with that key is returned.
///
/// Type of the source sequence
/// Type of the projected element
/// Source sequence
/// Projection for determining "distinctness"
/// A sequence consisting of distinct elements from the source sequence,
/// comparing them by the specified key projection.
public static IEnumerable DistinctBy(this IEnumerable source,
Func keySelector)
{
return source.DistinctBy(keySelector, null);
}
public static TSource[] ToArray(this IEnumerable source, int count)
{
if (source == null) throw new ArgumentNullException("source");
if (count < 0) throw new ArgumentOutOfRangeException("count");
var array = new TSource[count];
int i = 0;
foreach (var item in source)
{
array[i++] = item;
}
return array;
}
///
/// Returns all distinct elements of the given source, where "distinctness"
/// is determined via a projection and the specified comparer for the projected type.
///
///
/// This operator uses deferred execution and streams the results, although
/// a set of already-seen keys is retained. If a key is seen multiple times,
/// only the first element with that key is returned.
///
/// Type of the source sequence
/// Type of the projected element
/// Source sequence
/// Projection for determining "distinctness"
/// The equality comparer to use to determine whether or not keys are equal.
/// If null, the default equality comparer for TSource is used.
/// A sequence consisting of distinct elements from the source sequence,
/// comparing them by the specified key projection.
public static IEnumerable DistinctBy(this IEnumerable source,
Func keySelector, IEqualityComparer comparer)
{
if (source == null) throw new ArgumentNullException("source");
if (keySelector == null) throw new ArgumentNullException("keySelector");
return DistinctByImpl(source, keySelector, comparer);
}
private static IEnumerable DistinctByImpl(IEnumerable source,
Func keySelector, IEqualityComparer comparer)
{
var knownKeys = new HashSet(comparer);
foreach (var element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}
}