Dizeden farklı olanları almak

Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Merhaba arkadaşlar;



capdizi = ( "8","8","8","8","8","8","8","8","10","10","10","10","12","12","12","12","12","14","14")
adetdizi = ( "15","5","3","24","58","68","18","98","25","36","43","45","15","19","102","120","2","40","4",)
lboydizi = ( "180","150","200","120","130","140","110","155","100","110","120","810","120","112","120","182","125","140","114")

bu şekilde dizilerim mevcut. burada bir çarpım yapmak istiyorum. ama her çapımın sonucunu ayrı bir değişkende almak istiyorum.

( adet * lboy )
--------------------

ø8 * 52160
ø10 * 16570
ø12 * 38258
ø14 * 6056



C#:
  foreach (var capv in capdizi)
                {
                    MessageBox.Show("Çapım : " + capv * adet * lboy);
                }

bunu nasıl yapabilirim ?


yardımcı arkadaşa şimdiden teşekkürler.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,284
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Merhaba. Sonuç dizisi yerine List nesnesini kullanabilirsiniz. Aşağıdaki kodu C#' a çevirin.

C#:
dim lst as new list(of integer)

for i= 0 to capdizi.length - 1
   lst.add(capdizi(i) * adetdizi(i) * lboydizi(i))
next
.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Zeki bey;

for döngüsünde capdizi nin uzunluğunu(length) kullanamıyorum. Hata veriyor.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
bu şekilde işlemi yaptım. yalnız işler biraz karıştı...

C#:
  for (int i = 0; i < capdizi.Count; i++)
                {
                   sonuc.Add(capdizi[i] * adetdizi[i] * lboydizi[i]);
                }

şimdi öncelikle değişkenleri bi belirlemem lazım. bu değişkenlere de ekleme yapacağız. capdizi de ki elemanlardan 8 10 12 ve 14 ü nasıl alabiliriz ? yani tüm diziyi değilde sadece farklı olanları...? ( bu noktadan devam etmeliyim...)
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
C#:
Sub Test()
    Dim i As Integer, tempVal As Double, sum8 As Double, sum10 As Double, sum12 As Double, sum14 As Double
    
    capdizi = Array(8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 12, 14, 14)
    adetdizi = Array(15, 5, 3, 24, 58, 68, 18, 98, 25, 36, 43, 45, 15, 19, 102, 120, 2, 40, 4)
    lboydizi = Array(180, 150, 200, 120, 130, 140, 110, 155, 100, 110, 120, 810, 120, 112, 120, 182, 125, 140, 114)


    For i = 0 To UBound(capdizi)
        tempVal = adetdizi(i) * lboydizi(i)
        Select Case capdizi(i)
            Case 8
                sum8 = sum8 + tempVal
            Case 10
                sum10 = sum10 + tempVal
            Case 12
                sum12 = sum12 + tempVal
            Case 14
                sum14 = sum14 + tempVal
        End Select
    Next

    MsgBox "Metraj sonuçları:" & vbCrLf & vbCrLf & "Ø8 : " & sum8 & vbCrLf & "Ø10 : " & sum10 & vbCrLf & "Ø12 : " & sum12 & vbCrLf & "Ø14 : " & sum14 & vbCrLf
End Sub
.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
Hocam kod için çok teşekkür ederim. Bu örnekte anlaşılsın diye çapdizisinin içeriğini verdim. çapları ben bilmiyorum normalde seçtğimde geliyorlar...

bu durumda nasıl olmalıdır.. yani 16 - 22 ... 32 de olabilir.

tempVal = adetdizi(i) * lboydizi(i)

böyle yaparsak 8 lik ve diğer çarpların adet boyları çarpılmış olur, yanılmıyorsam... oysaki 8 10 12 hepsi ayrı grup. dolayısı ile kendi adet ve l boyları ile çarpılmalıdır. o yüzden renkli yaptım.
 

mersilen

Destek Ekibi
Destek Ekibi
Katılım
31 Aralık 2009
Mesajlar
1,101
Excel Vers. ve Dili
excel 2007 türkçe
bu şekilde işlemi yaptım. yalnız işler biraz karıştı...

C#:
  for (int i = 0; i < capdizi.Count; i++)
                {
                   sonuc.Add(capdizi[i] * adetdizi[i] * lboydizi[i]);
                }

şimdi öncelikle değişkenleri bi belirlemem lazım. bu değişkenlere de ekleme yapacağız. capdizi de ki elemanlardan 8 10 12 ve 14 ü nasıl alabiliriz ? yani tüm diziyi değilde sadece farklı olanları...? ( bu noktadan devam etmeliyim...)
Deneyebilirsiniz;
Kod:
using System;
using System.Linq;

class Program
{
    static void Main()
    {
        // Declare an array with some duplicated elements in it.
        int[] array1 = { 1, 2, 2, 3, 4, 4 };
        // Invoke Distinct extension method.
        var result = array1.Distinct();
        // Display results.
        foreach (int value in result)
        {
            Console.WriteLine(value);
        }
    }
}
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@mersilen

Evet. aynen budur. Çok Teşekkür ederim... Birinci kısım bitti...
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bence en kestirmesi, çap dizisini tüm çaplar için hazırlamak, diğer dizilerde olmayan çaplar için sıfır (0) değeri girmek;

C#:
Sub Test()
    Dim i As Integer, tempVal As Double, sum8 As Double, sum10 As Double, sum12 As Double, sum14 As Double
    
    capdizi = Array(8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 12, 14, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32)
    adetdizi = Array(15, 5, 3, 24, 58, 68, 18, 98, 25, 36, 43, 45, 15, 19, 102, 120, 2, 40, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0)
    lboydizi = Array(180, 150, 200, 120, 130, 140, 110, 155, 100, 110, 120, 810, 120, 112, 120, 182, 125, 140, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0)


    For i = 0 To UBound(capdizi)
        tempVal = adetdizi(i) * lboydizi(i)
        Select Case capdizi(i)
            Case 8
                sum8 = sum8 + tempVal
            Case 10
                sum10 = sum10 + tempVal
            Case 12
                sum12 = sum12 + tempVal
            Case 14
                sum14 = sum14 + tempVal
            Case 14
                sum14 = sum14 + tempVal
            Case 16
                sum16 = sum16 + tempVal
            Case 18
                sum18 = sum18 + tempVal
            Case 20
                sum20 = sum20 + tempVal
            Case 22
                sum22 = sum22 + tempVal
            Case 24
                sum24 = sum24 + tempVal
            Case 26
                sum26 = sum26 + tempVal
            Case 28
                sum28 = sum28 + tempVal
            Case 30
                sum30 = sum30 + tempVal
            Case 32
                sum32 = sum32 + tempVal
        End Select
    Next

    MsgBox "Metraj sonuçları:" & vbCrLf & vbCrLf & "Ø8 : " & sum8 & vbCrLf & "Ø10 : " & sum10 & vbCrLf & "Ø12 : " & sum12 & vbCrLf & "Ø14 : " & sum14 & vbCrLf & _
     "Ø16 : " & sum16 & vbCrLf & "Ø18 : " & sum18 & vbCrLf & "Ø20 : " & sum20 & vbCrLf & "Ø22 : " & sum22 & vbCrLf & _
     "Ø24 : " & sum24 & vbCrLf & "Ø26 : " & sum26 & vbCrLf & "Ø28 : " & sum28 & vbCrLf & "Ø30 : " & sum30 & vbCrLf & "Ø32 : " & sum32
End Sub
.
 

mersilen

Destek Ekibi
Destek Ekibi
Katılım
31 Aralık 2009
Mesajlar
1,101
Excel Vers. ve Dili
excel 2007 türkçe
Aşağıdaki kodları incelemenizi öneririm.
Kod:
C#;

using System;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
     string[] cars = {"Volvo", "BMW", "Ford", "Mazda","Merce"};
     string[]dizi1=new string[]{"a","b","c","d","e"};
     int[] dizi2=new int[]{1,1,2,3,5};
     int[] dizi3= new int [] {1,1,2,3,5};
           int x = 0;
          foreach  (var ad in cars)
            {   
                Console.WriteLine(ad+"  \t" + dizi1[x]+"  \t" + dizi2[x]+"  \t" + dizi3[x]+"  \tcars.Length\t" + cars.Length+"  \tcars.index\t" + x);
                 x++;
            }
    
     Console.WriteLine("/*****************\t******************/");
        
         for (int i = 0; i < cars.Length; i++)
            {
                Console.WriteLine(cars[i]+"  \t" + dizi1[i]+"  \t" + dizi2[i]+"  \t" + dizi3[i]+"  \tcars.Length\t" + cars.Length+"  \tcars.index\t" + i);
            }
    Console.WriteLine("/*****************\t******************/\n");
    Console.WriteLine("Diziyi benzersiz yapma.\t 'using System.Linq'  eklenmeli. ");
          // Declare an array with some duplicated elements in it.
        int[] array1 = { 1, 2, 2, 3, 4, 4 };
        // Invoke Distinct extension method.
        var result = array1.Distinct();
        // Display results.
        foreach (int value in result)
        {
            Console.WriteLine(value);   
        }     

    }         
}
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@Haluk;


Algoritmayı bende tam oluşturamadım aslında... Ne yapılacağını biliyorum, ama bunu kod ile ifade edemiyorum... adım adım gideceğiz bakalım., takıldığım yerde yine sorarım hocam.

Teşekkürler.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
@mersilen

çapdizisi nde bensersiz bir liste yaptık. bunların adet ve L boyları diğer dizilerde.

mesela 8 lik için adet ve L boyu bilgilerini nasıl alabiliriz ? veya Regex ile mi yapmalıyız. bütün veriler listbox da

regex için kullandığım desen : (\d+)ø(\d+)\/?\d*?\s+?L=(\d+)
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bence siz projenin kurgusunda hata yapıyorsunuz....

Bahsettiğiniz verileri bir veritabanına yazdırsanız, mesela Access dosyasına ..... sonradan ihtiyaç duyacağınız hesaplama / sorgulama işlerini bu veritabanına ADO ile bağlanıp, doğru dürüst yaparsınız.

.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
hocam veriler zaten dwg dosyada. o yüzden ayrıca bir veritabanına gerek yok...

Evet doğru ve dürüst bir şekilde yapacağız. hatasız-eksiksiz.

Bu hesaplamayı doğrudan tonaj verecek şekilde yaptım. şimdi detaylandırma kısmı kaldı işte...
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Peki, siz daha iyi biliyorsunuzdur...

.
 
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
hayır hocam yanlış anlamadınız inşallah ? ,ben şu an ki konuda ne yapılmasını biliyorum.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
VBA ile istediğiniz türden bir çözüm aşağıdaki kodlarla yapılmaktadır. Demir çapları otomatik olarak ayıklanarak metraj yapılmaktadır.

C# kullanmadığım için, bu kodları C#'a uyarlama konusunda yardımcı olamam....

C#:
Sub Test2()
    ' Haluk 23/02/2022
    Dim RS As Object, uniqueCaps As New Collection
    Dim i As Integer, j As Integer, mySum As Double
  
    Const adDouble = 5
  
    capDizi = Array(8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 12, 14, 14)
    adetDizi = Array(15, 5, 3, 24, 58, 68, 18, 98, 25, 36, 43, 45, 15, 19, 102, 120, 2, 40, 4)
    lboyDizi = Array(180, 150, 200, 120, 130, 140, 110, 155, 100, 110, 120, 810, 120, 112, 120, 182, 125, 140, 114)
  
    For i = 0 To UBound(capDizi)
        xMatch = CStr(capDizi(i))
        On Error Resume Next
            uniqueCaps.Add xMatch, xMatch
        On Error GoTo 0
    Next
  
    Set RS = CreateObject("ADODB.Recordset")
    RS.Fields.Append "Cap", adDouble
    RS.Fields.Append "Adet", adDouble
    RS.Fields.Append "Boy", adDouble
    RS.Open
  
    For i = LBound(capDizi) To UBound(capDizi)
        RS.AddNew
        RS.Fields("Cap").Value = capDizi(i)
        RS.Fields("Adet").Value = adetDizi(i)
        RS.Fields("Boy").Value = lboyDizi(i)
    Next
  
    RS("Cap").Properties("Optimize") = True
  
    RS.Update
    RS.MoveFirst
  
    For i = 1 To uniqueCaps.Count
        mySum = 0
        RS.Filter = "Cap = " & uniqueCaps.Item(i)
      
        For j = 0 To RS.RecordCount - 1
            mySum = mySum + RS.Fields("Adet") * RS.Fields("Boy")
            RS.MoveNext
        Next
      
        temp = temp & "Ø" & uniqueCaps.Item(i) & vbTab & " : " & mySum & vbCrLf
    Next
  
    MsgBox "Metraj sonuçları: " & vbCrLf & vbCrLf & temp
  
    RS.Close
    Set RS = Nothing
End Sub



.
 
Son düzenleme:
Katılım
17 Haziran 2008
Mesajlar
1,859
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
Altın Üyelik Bitiş Tarihi
26-03-2020
hocam emeğiniz için çok teşekkür ederim., sanırım nasıl yapacağımı buldum...

* Regex parametrelerinden birini döngüye alarak deneyeceğim...
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Siz yine de benim VBA kodunu bilgisayarda saklayın..... heryerde bulamayacağınız cinste güzel bir kod oldu.

.
 

Haluk

𐱅𐰇𐰼𐰚
Katılım
7 Temmuz 2004
Mesajlar
12,323
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Alternatif olarak, ADO Recordset kullanmadan;

C#:
Sub Test3()
    ' Haluk 23/02/2022
    Dim uniqueCaps As New Collection
    Dim i As Integer, j As Integer, mySum As Double
 
    Const adDouble = 5
 
    capDizi = Array(8, 8, 8, 8, 8, 8, 8, 8, 10, 10, 10, 10, 12, 12, 12, 12, 12, 14, 14)
    adetDizi = Array(15, 5, 3, 24, 58, 68, 18, 98, 25, 36, 43, 45, 15, 19, 102, 120, 2, 40, 4)
    lboyDizi = Array(180, 150, 200, 120, 130, 140, 110, 155, 100, 110, 120, 810, 120, 112, 120, 182, 125, 140, 114)
 
    For i = 0 To UBound(capDizi)
        xMatch = CStr(capDizi(i))
        On Error Resume Next
            uniqueCaps.Add xMatch, xMatch
        On Error GoTo 0
    Next
 
    For i = 1 To uniqueCaps.Count
        mySum = 0
      
        For j = 0 To UBound(capDizi)
            If CDbl(capDizi(j)) = CDbl(uniqueCaps.Item(i)) Then
                mySum = mySum + adetDizi(j) * lboyDizi(j)
            End If
        Next
        
        temp = temp & "Ø" & uniqueCaps.Item(i) & vbTab & " : " & mySum & vbCrLf
    Next
 
    MsgBox "Metraj sonuçları: " & vbCrLf & vbCrLf & temp
End Sub
.
 
Üst