2014-09-25 2 views
1

나는 다음과 같은 목록을했습니다 :linq를 사용하여 C#의 목록에서 가장 근접하고 작은 값을 찾으십니까?

public List<Dictionary<int, int>> blanks { get; set; } 

이 일부 인덱스 값을 유지 : 또한

enter image description here

또한라는 변수 X에서 X는 임의의 값을 취할 수있다. X에 가장 가깝고 더 작은 'Key'값을 찾고 싶습니다.이 코드 블록을 통해 가장 가까운 값만 가져올 수 있습니다. 그러나, 더 작은 것을 취할 수는 없습니다.

var diffs = kaynaklarArray[l].blanks.SelectMany((item, index) => item.Select(entry => new { Index = index, Key = entry.Key, Diff = Math.Abs(entry.Key - X) })).OrderBy(item => item.Diff); 
var closestDiff = diffs.First(); 
var key = closestDiff.Key; 
var value = (kaynaklarArray[l].blanks[closestDiff.Index])[closestDiff.Key]; 

X 1000의 경우, 내가 공백 지수 먹고 싶어 : 1 키 : 2 및 키 :이 X에 비해 작기 때문에, (750)는 그러나이 코드 블록은 인덱스 소요 (1200) 내가 원하지 않는 그것.

어떻게하면됩니까? 또한

나는 목록과 같이도했습니다 :

List<List<int[]>> lastList = new List<List<int[]>>(); 

enter image description here

이 시간, 내가 먼저 목록의 인덱스와 두 번째 목록의 인덱스를 먹고 싶어. 예를 들어, X가 800 인 경우 0과 0 (인덱스 0)을 취하고 1과 1 (인덱스 1의 경우)을 취하려고합니다.

이번에도 코드 블록이 있습니다. 그러나 더 작은 것을 가질 수는 없습니다. 가장 가까운 것을 필요로합니다.

var diffSecond = lastList.SelectMany((listS, listIndex) => listS. 
SelectMany((array, arrayIndex) => array.Select((item, itemIndex) => new 
{ 
    ListIndex = listIndex, 
    ArrayIndex = arrayIndex, 
    ItemIndex = itemIndex, 
    Diff = Math.Abs(item - X) 
}))); 

var closestDiffS = diffSecond.Aggregate((agg, item) => (item.Diff < agg.Diff) ? item : agg);            
+0

가능한 중복 :

var diffSecond = lastList.SelectMany((listS, listIndex) => listS. SelectMany((array, arrayIndex) => array //Not here, 'cause you need the index .Select((item, itemIndex) => new { ListIndex = listIndex, ArrayIndex = arrayIndex, ItemIndex = itemIndex, Diff = X - item }).Where(item => item.Diff > 0) )); 

가장 작은 DIFF 모든 목록을 얻으려면 : //stackoverflow.com/questions/25910324/find-closest-value-in-a-list-in-c-sharp-with-linq) – Xaruth

+0

어딘가에 (항목

+0

@Xaruth이 질문의 의견에는 너무 홍수가 나서 새로운 질문을 만들었습니다. – 1teamsah

답변

0

변경

Diff = Math.Abs(item - X) 

Diff = X - item 

다음

var closestDiffS = diffSecond.Aggregate((agg, item) => (item.Diff > 0 && item.Diff < agg.Diff) ? item : agg); 

은 또는, 당신은 어디 필요합니다. 나는 여기에 가기로되어 생각 : [? LINQ와 C#에서 목록에 가장 가까운 값을 찾기] (HTTP의

var closestDiffS = diffSecond.GroupBy(item => item.Diff).OrderBy(group => group.Key).FirstOrDefault(); 
+0

감사합니다. 사전이있는 나의 첫번째 질문을위한 해결책은 무엇 일 수 있는가? – 1teamsah

+0

기본적으로 같은 것. 'var diffs = kaynaklarArray [l] .blanks.SelectMany ((item, index) => item.Select (entry => new {인덱스 = 인덱스, Key = entry.Key, Diff = X - entry.Key}). (item => item.Diff> 0)) OrderBy (item => item.Diff); ' –

+0

답안의 두 번째 해와 그 위의 샘플 코드는'item '에 대한 오류를 제공합니다 : http://i.imgur.com/ k2lTTMd.png – 1teamsah

관련 문제