2010-05-21 3 views
5

Find 메서드를 사용하여 람다 식을 사용하여 다른 값을 기반으로 값 목록에서 항목을 찾으려고합니다. 이 예제에서 나는 -1000을 되 찾을 것으로 기대하지만, 저의 삶에 대해서, 나는 적절한 lamda 표현을 생각 해낼 수 없습니다. 혼란 스럽다면 아래의 코드와 설명이 더 잘 설명되기를 바랍니다. TIA.C# 람다를 사용하여 범위에서 값 찾기

using System; 
using System.Collections.Generic; 

namespace TestingStuff { 
    class Program { 
     static void Main(string[] args) { 
      double amount = -200; 

      //The Range of values 
      List<MyValue> values = new List<MyValue>(); 
      values.Add(new MyValue(-1000)); 
      values.Add(new MyValue(-100)); 
      values.Add(new MyValue(-10)); 
      values.Add(new MyValue(0)); 
      values.Add(new MyValue(100)); 
      values.Add(new MyValue(1000)); 

      //Find it!!! 
      MyValue fVal = values.Find(x => (x.Value > amount) && (x.Value < amount)); 

      //Expecting -1000 as a result here since -200 falls between -1000 and -100 
      //if it were -90 I'd expect -100 since it falls between -100 and 0 
      if (fVal != null) 
       Console.WriteLine(fVal.Value);    
      Console.ReadKey(); 
     } 
    } 

    public class MyValue { 
     public double Value { get; set; } 
     public MyValue(double value) { 
      Value = value; 
     }   
    } 
} 

음 예상되는 모든 결과를 지정함으로써 내 의도를 조금 더 명확하게하겠습니다.

-1000 및 -101으로 이하
-1000 -100에게 제공한다 - 11 -100 주어야
-10 주어야에 -1 -10
0-9 0
10~99 줘야 10
100-999은
1000 이상 (100) 당신은 논리적 실수 ... 값이 동시에> -200 및 < -200이 될 수 없습니다했던 1000

+0

+200을 사용하는 경우 무엇을 기대합니까? – Darksider

+0

-100을 사용하면 결과로 -1000 또는 -100을 기대합니까? –

답변

6

이 작동합니다 :

values.FindLast(x => amount >= x.Value); 
+0

굉장한 이것은 percect입니다. 얼마나 우아한가! – n4rzul

+0

어쩌면 100 %가 아닌 100 %가 1000을 제공해야하지만 모든 인스턴스에 대해 충족시킬 수는 있지만 -1000을 제공해야하므로 -1000을 제공해야합니다.그래도 목록의 시작 부분에 매우 큰 음의 값을 추가 할 수는 있지만 잘 작동합니다. – n4rzul

2

제공한다 제공한다 제공해야합니다. U 표현식이 필요합니다 ("||")

,363,210
MyValue fVal = values.Find(x => (x.Value > amount) || (x.Value < amount)); 

하지만 -1000을 얻을 것으로 예상되는 경우 -1000보다 작은 -200

편집 때문에이 표현도

MyValue fVal = values.Find(x => (x.Value < amount)); 

잘못 : 좋아, 내가 당신의 의도를 missunderstood 생각합니다. 그러나 당신이 당신의 가치를 선택하는 방식은 나에게 논리적으로 보이지 않습니다. 다음 작은 값을 원하십니까?

+0

예상되는 모든 결과와 함께 주요 질문을 업데이트했습니다. 참조하십시오. 기본적으로 원하는 것은 숫자 이외의 두 날짜 사이에있는 결과를 검색 할 때 SQL 문에서와 같이 사이를 수행하는 것입니다. EG : 사용자 FROM SELECT * 가에서 CreationDate> '2010-03-01'는 과에서 CreationDate는 < '2010-03-31'는 3월 1일 31 년 3 월 희망 사이에 모든 사용자를 찾아 이가 있습니다 감각 – n4rzul

1
난 당신이 값 90을 사용하는 경우, 당신은 100이 아니라 제로,뿐만 아니라 당신이 200을 사용하는 경우 등을 기대할 수 있다는 가정을 만들고 있어요

, 당신이 기다리고있어 1000 없습니다 (100)

MyValue fVal = values 
    .Where(x => amount > 0 ? x.Value > amount : x.Value < amount) 
    .OrderBy(x => amount > 0 ? x.Value : -x.Value).First(); 
+0

아니, 다른 방법 라운드 – n4rzul

0

을 Darksider과 같은 가정을 만드는 또 다른 옵션은 물론이의

MyValue fVal = values.Find(x => Math.Abs(x.Value) > amount && (x.Value<0 == amount<0)); 

것 이미 정렬 된 목록에 의존합니다. 리스트가 alreday로 정렬되지 않으면 Darksider의 해결책이 더 나을 수도 있습니다.

+0

줄리안은 매우 작은 음수 값을 제외하고는 제 경우에 올바르게 작동합니다. 목록에 매우 작은 음수 값을 추가하면됩니다. – n4rzul

관련 문제