program tip

LINQ의 FirstOrDefault와 함께 KeyValuePair가 있는지 확인하십시오.

radiobox 2020. 10. 29. 08:00
반응형

LINQ의 FirstOrDefault와 함께 KeyValuePair가 있는지 확인하십시오.


유형의 사전이 있습니다.

Dictionary<Guid,int>

조건이 충족되는 첫 번째 인스턴스를 반환하고 싶습니다.

var available = m_AvailableDict.FirstOrDefault(p => p.Value == 0)

그러나 실제로 KeyValuePair를 반환하는지 어떻게 확인합니까? 컴파일러 오류없이! = 또는 ==를 사용하여 default (KeyValuePair)를 확인할 수없는 것 같습니다. 여기 에 해결책이없는 것 같은 유사한 스레드가 있습니다 . 실제로 키를 얻고 Guid의 기본값을 확인하여 내 특정 문제를 해결할 수 있지만 keyvaluepair로이 작업을 수행하는 좋은 방법이 있는지 궁금합니다. 감사


존재에 관심이 있다면 ContainsValue(0)또는 Any(p => p.Value == 0)대신 사용할 수 있습니까? 으로 검색하는 것은 a Dictionary<,>; 키로 검색하는 경우 TryGetValue.

다른 접근 방식 :

var record = data.Where(p => p.Value == 1)
     .Select(p => new { Key = p.Key, Value = p.Value })
     .FirstOrDefault();

이것은 클래스를 반환합니다 null. 찾을 수없는 경우에도 마찬가지입니다 .


다음과 같이 변경하는 것이 좋습니다.

var query = m_AvailableDict.Where(p => p.Value == 0).Take(1).ToList();

그런 다음 목록이 비어 있는지 여부를 확인하고 그렇지 않은 경우 첫 번째 값을 취할 수 있습니다.

if (query.Count == 0)
{
    // Take action accordingly
}
else
{
    Guid key = query[0].Key;
    // Use the key
}

사전에 "첫 번째"항목에 대한 실제 개념이 없습니다. 반복되는 순서가 잘 정의되어 있지 않습니다. 해당 값 으로 처음 입력 된 키 / 값 쌍을 얻으려면 일종의 순서 보존 사전이 필요합니다.

(이것은 실제로 키를 알고 싶다고 가정합니다. 존재 확인 직후라면 Marc의 솔루션 이 가장 적합합니다.)


default () 키워드를 사용하십시오.

bool exists = !available.Equals(default(KeyValuePair<Guid, int>));

원하는 것은 Any일치하는 요소도 제공 하는 방법입니다. 이 방법을 직접 쉽게 작성할 수 있습니다.

public static class IEnumerableExtensions
{
  public static bool TryGetFirst<TSource>(this IEnumerable<TSource> source,
                                          Func<TSource, bool> predicate,
                                          out TSource first)
  {
    foreach (TSource item in source)
    {
      if (predicate(item))
      {
        first = item;
        return true;
      }
    }

    first = default(TSource);
    return false;
  }
}

당신은 확인할 수 있습니다

available.Key==Guid.Empty

유형을 지정하지 않고 KeyValuePair와 같은 구조체의 기본값을 확인하는 방법은 Activator를 사용하여 새 인스턴스를 만드는 것입니다.

if (available.Equals(Activator.CreateInstance(available.GetType())))
{
    Console.WriteLine("Not Found!");
}

참고 URL : https://stackoverflow.com/questions/793897/check-if-keyvaluepair-exists-with-linqs-firstordefault

반응형