• DİKKAT

    DOSYA İndirmek/Yüklemek için ÜCRETLİ ALTIN ÜYELİK Gereklidir!
    Altın Üyelik Hakkında Bilgi

Dizeden farklı olanları almak

  • Konbuyu başlatan Konbuyu başlatan k0081
  • Başlangıç tarihi Başlangıç tarihi
Katılım
17 Haziran 2008
Mesajlar
1,874
Excel Vers. ve Dili
Microsoft Ofis Profesyonel 2019 x64 TR
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.
 
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

.
 
Zeki bey;

for döngüsünde capdizi nin uzunluğunu(length) kullanamıyorum. Hata veriyor.
 
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...)
 
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:
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.
 
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);
        }
    }
}
 
@mersilen

Evet. aynen budur. Çok Teşekkür ederim... Birinci kısım bitti...
 
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

.
 
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);   
        }     

    }         
}
 
@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.
 
@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+)
 
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.

.
 
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...
 
Peki, siz daha iyi biliyorsunuzdur...

.
 
hayır hocam yanlış anlamadınız inşallah ? ,ben şu an ki konuda ne yapılmasını biliyorum.
 
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:
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...
 
Siz yine de benim VBA kodunu bilgisayarda saklayın..... heryerde bulamayacağınız cinste güzel bir kod oldu.

.
 
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

.
 
Geri
Üst