2016-10-22 123 views
-1

我有雙每個項目清單,其他項目在另一個列表進行比較

List<double> numbers1 = [1,3,5,6,4.5,2.1,.......]; 
List<double> numbers2 = [.5,3.2,5.4,6,4.5,2.1,.......]; 

2列出我想要[1]在列表1蒙山[0.5]在列表2

if([1] close to[.5])的比較例如

這意味着如果在fisrst列表中的第一項的值接近在第二列表 和等中的第一項的值,第二用第二,第三與第三

我該如何做這個c#?

+0

有什麼預期收益? – Sakuto

+0

什麼是「關閉」? – HimBromBeere

+2

換言/編輯你的問題,並解釋你想如何比較...以及如果列表1有更多的數字,然後列表2呢? – Jim

回答

1

只需選中使用Math.Abs兩個相關項目的區別:

bool allElementsClose = true; 
for(int i = 0; i < lis1.Count && allElementsClose; i++) 
{ 
    if(Math.Abs(list1[i] - list2[i]) > threshold) 
    { 
     Console.WiteLine("items not close"); 
     allElementsClose = false; 
     break; 
    } 
} 

但是,您應該迭代之前就項目的數量進行一些檢查。使用LINQ

替代做法:

var allElementsClose = list1 
    .Select((x, i) => Math.Abs(x - list2[i])) 
    .All(x => x < threashhold); 

這種方法使用的選擇使用Func<T, int>用於獲取元素及其在集合中的索引過載。然後可以使用此索引來獲取第二個列表中的相應項目並計算與其的差異。

+0

列表1確實有有'i'作爲索引到 – Jim

+0

'INT I = i'>我不會被實例化,所以我想你的意思是'INT I = 0' – Jim

+0

無後顧之憂,我們得到了它:) – Jim

0

其實它取決於「關閉」對你的意義。 我會假設,如果數字之間的差異小於1,它是接近的。

因此,代碼將是非常簡單的

我將創建3所列出。 list1的,list2中,listResult(這將只包含布爾值,其指示在list1的該項是否是接近項目在列表2。

var list1 = new List<float>(); 
var list2 = new List<float>(); 
var listResult = new List<bool>(); 

3個上面的行,應該去的方法或事件之外的,喜歡的button1_Click。

//to add values to the list you can use list1.addNew(5) and it will add the "5" to the list 

void CompareLists(){ 
    //first of all we check if list1 and list2 have the same number of items 
    if(list1.Count == list2.Count){ 
     for (int i=0; i<list1.Count; i++){     
      if (list1[i] - list2[i] < 1) 
       listResult.addNew(true); 
      else 
       listResult.addNew(false); 
     } 
    } 
} 

現在你有一個像 [真],[真],[虛假]

希望,它爲你的作品boolens的列表。

1

最簡單的解決方案將是使用Zip,其是指對兩個集合的每個映射元素的比較,也將照顧差中的元素數目,因爲它會檢查Enumerator.MoveNext()內部

var result = numbers1.Zip(numbers2,(n1,n2) => n1 - n2 < 0.5 ? "Close" : "Not Close"); 

resultIEnumerable<string>由值"Close" and "Not Close"

警告:

  • 你的問題有很多細節缺失,因爲我不確定什麼是「關閉」和什麼是「不關閉」,我假設小於0。兩個數字之間的5差接近,修改按規定
+1

將溶液冷卻,沒不知道這種方法存在。 – HimBromBeere

+0

@HimBromBeere :),Linq中存在很多這樣的gem,事實上許多已知的API都有有趣的重載來實現結果 –

0

在.NET 4.0中,你還可以Zip()可供選擇:

var numbers1 = new List<double>() { 1, 3, 5, 6, 4.5, 2.1 }; 
var numbers2 = new List<double>() { 0.5, 3.2, 5.4, 6, 4.5, 2.1 }; 

var allElementsClose = numbers1 
    .Zip(numbers2, (i1, i2) => Math.Abs(i1 - i2)) 
    .All(x => x < threshold); 
相關問題