Linq。选择foreach

时间:2016-09-29 15:06:38

标签: c# .net linq

我需要一些从System.Linq方法转换为非Linq版本的.Net转换的帮助。

对于Funktion Select():

 private readonly Dictionary<int, string> _foobarKeys = new Dictionary<int, string>();

 public IEnumerator<KeyValuePair<string, object>> GetFoobarator()
        {
            return _foobarKeys.Values
                               .Select(k => new KeyValuePair<string, object>(k, _dict[k]))
                               .GetFoobarator();
        }

相同的问题是函数Max():

var maxKeyIndex = _foobarKeys.Keys.Max();

...任何():

_foobarKeys.Any(kv => kv.Value == key)

和FirstOrDefault():

 private readonly Dictionary<string, object> _bar = new Dictionary<string, object>();
public bool Remove(string key)
        {
            var fooIndex = _foobarKeys.FirstOrDefault(kv => kv.Value == key)
                                       .Key;

            _foobarKeys.Remove(fooIndex);
            return _bar.Remove(key);
        }

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用内置的LINQ扩展方法有什么问题?

无论如何,这里有可能的实现:

选择

  

将序列的每个元素投影到新表单中。

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> sequence, Func<TSource, TResult> selector)
{
    if (sequence == null) throw new ArgumentNullException("sequence");
    if (selector == null) throw new ArgumentNullException("selector");
    foreach (TSource element in sequence)
       yield return selector(element);
}

最高

  

返回通用序列中的最大值。

public static TSource Max<TSource>(this IEnumerable<TSource> sequence)
{
    if (sequence == null) throw new ArgumentNullException();
    Comparer<TSource> comparer = Comparer<TSource>.Default;
    TSource value = default(TSource);
    if (value == null)
    {
        foreach (TSource elem in sequence)
             if (elem != null && (elem == null || comparer.Compare(elem, value) > 0))
                   value = elem;
        return value;
    }
    else
    {
        bool hasValue = false;
        foreach (TSource elem in sequence)
        {
            if (hasValue)
            {
                if (comparer.Compare(elem, value) > 0)
                   value = elem;
            }
            else
            {
                    value = elem;
                    hasValue = true;
            }
        }

        if (!hasValue) // No elements in sequence
            throw new InvalidOperationException();

        return value;
    }
}

任何

  

确定序列的任何元素是否满足条件。

public static bool Any<TSource>(this IEnumerable<TSource> sequence, Func<TSource, bool> predicate)
{
    if (sequence == null) throw new ArgumentNullException("sequence");
    if (predicate == null) throw new ArgumentNullException("predicate");
    foreach (TSource elem in sequence)
       if (predicate(elem))
          return true;
    return false;
}

FirstOrDefault

  

如果没有找到这样的元素,则返回满足条件的序列的第一个元素或默认值。

 public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> sequence, Func<TSource, bool> predicate)
 {
     if (sequence == null) throw new ArgumentNullException("sequence");
     if (predicate == null) throw new ArgumentNullException("predicate");
     foreach (TSource elem in sequence)
         if (predicate(elem))
             return elem;
     return default(TSource);
 }