2012-08-22 2 views
1
public class Stock 
{ 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ObjectCache cache = MemoryCache.Default; 
     cache["test"] = new Stock(); 
     var x = cache.OfType<Stock>().ToList(); 
    } 
} 

이것은 비어 있습니다. OfType은 T 유형의 컬렉션에있는 모든 인스턴스를 반환한다고 생각 했습니까? 그래서 문제가LINQ.OfType() 연산자를 올바르게 사용하고 있습니까?

아래에 사전의 인스턴스 인 ObjectCache으로처럼 보인다 -

그냥 나는 또한이 그러나 작동

List<object> lstTest = new List<object>(); 
     lstTest.Add(new Stock()); 
     var y = lstTest.OfType<Stock>().ToList(); 

시도 가능한 원인으로 ObjectCache을 배제하기

솔루션

cache.Select(item => item.Value).OfType<T>().ToList() 

감사 알렉세이!

+1

두 번째 샘플은 여전히 ​​사용으로 KeyValuePairs 세트 얻을 수 있도록 캐시 작업 ... 사전처럼 작동'cache' :'Y = cache.OfType () ...'잘 작동합니다. –

+0

Ooops는 그것을 놓쳤습니다.하지만 실제로 작동하는 ObjectCache가 실제로 작동하지 않는 이유는 무엇입니까? – blue18hutthutt

답변

5

MemoryChache은 값없는, KeyValuePair<string,Object>의 열거를 반환 MemoryChache.GetEnumerator().

귀하의 물품을 얻으려면 대소 문자를 구분해야합니다. 다음과 같음 :

var y = cache.Select(item => item.Value).OfType<Stock>(); 
+0

정말 고마워요! 나는 내 머리를 찢을 준비가되어 있었다. 고맙습니다! – blue18hutthutt

+0

+1 : @AlexeiLevenkov 당신의 방법이 내 것보다 낫다고 말하고 싶습니다 :) :) :) !! 나는 당신이 한 것처럼 가치를 얻는 것이 가능하다는 것을 즉시 알아 채지 못했습니다. – horgh

0

예. 미안 해요. ObjectCache는 IEnumerable입니다.> IDictionary가 아닙니다.

이 작동 :

var c = cache.Select(o => o.Value).OfType<Stock>().ToList(); 
+0

죄송합니다 .ToList()를 추가하는 것을 잊어 버렸습니다 - 작동하지 않습니다. – blue18hutthutt

+0

예. 방금 대답을 업데이트합니다. 먼저 값의 모음을 가져와야합니다. ObjectCache는 IEnumerable입니다. > – oshea00

0

이것은 나를 위해 일했다.

공용 클래스 주식 { 공공 주식() { 이름 = "에린"; } public string Name {get; 세트; } }

class Program 
{ 
    static void Main(string[] args) 
    { 
     System.Collections.ArrayList fruits = new System.Collections.ArrayList(4); 
     fruits.Add("Mango"); 
     fruits.Add("Orange"); 
     fruits.Add("Apple"); 
     fruits.Add(3.0); 
     fruits.Add("Banana"); 
     fruits.Add(new Stock()); 

     // Apply OfType() to the ArrayList. 
     var query1 = fruits.OfType<Stock>(); 

     Console.WriteLine("Elements of type 'stock' are:"); 
     foreach (var fruit in query1) 
     { 
      Console.WriteLine(fruit); 
     } 

    } 
} 

IEnumerable은 느리게 평가됩니다. foreach를 사용하여 query1을 반복하면 Stock 객체 만 찾을 수 있습니다.

2

cache.GetValues(new string[] {"test"}).Values.OfType<Order>() 

작업 것이다 그러나 나는 당신이 사용한다고 생각하지 않습니다. 당신이 GetValues

+0

+1 : 예. 이것은 다른 방법입니다 (아마 내 것보다 낫습니다). –

+0

'GetValues'의 긍정적 인면은 검색 할 키 목록을 제공 할 기회를 제공한다는 것입니다. – horgh

관련 문제