Login Login
MORE

WIDGETS

Widgets

Wanted articles
Who is online?
Article tools

Difference between revisions of "CSharp:Esempi LinQ"

From Aino Wiki

Jump to: navigation, search
(FILTRO su ordinamento alfabetico)
 
(No difference)

Latest revision as of 20:07, 12 December 2024

Operazioni su Liste

Eliminazione condizionale di tutti gli elementi

Rimozione di elementi di una lista, nel seguente caso 'ShipData.Instance.lstAIVDO' è una lista del tipo 'List'

ShipData.Instance.lstAIVDO.RemoveAll(x => x.SourceName == UnifiedCollectorDataModel.ShipDataModel.Enums.EnumSourceName.O.ToString());

Trasformazione di una lista in stringa CSV

rowguids = String.Join("|", DVAInvoiceList.Where(i => i.IsSelected).Select(p => p.ROWGUID).ToArray());

FILTRO su ordinamento alfabetico

Data una stringa, es un nome file costruito su una data, si vogliono tutte le stringe successive in ordinamento alfabetico ad una data come comparazione.
Doc Microsoft CompareOrdinal
Si usa la funzione CompareOrdinal:

using System;
using System.Linq;
using System.Collections.Generic;
 
public class Feature
{
	public int Id { get; set; }
	public string ColumnValues { get; set; }
}
 
public class Program
{
	public static void Main()
	{            
		var features = new List<Feature> {  
				    new Feature {Id=1,ColumnValues="cdr_2024-12-11_09-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-01_09-00-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-03_07-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-03_10-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-06_06-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-04_10-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-05_09-00-00.log.gz" },
				    new Feature {Id=1,ColumnValues="cdr_2024-12-05_10-00-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-06_05-00-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-02_08-00-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-01_10-00-00.log.gz" }, 
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-02_10-00-00.log.gz" }, 
				    new Feature {Id=1,ColumnValues="cdr_2024-12-06_06-30-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-07_10-00-00.log.gz" },
                                    new Feature {Id=1,ColumnValues="cdr_2024-12-01_00-00-00.log.gz" }
            };
 
        string strToComapre = "cdr_2024-12-07_00-00-00.log.gz";
        int lenOfString = 1;
	int i = 0;
 
        var query = (from feature in features
                         where String.CompareOrdinal(feature.ColumnValues, strToComapre) >= 0
			//where String.CompareOrdinal(feature.ColumnValues, 0, strToComapre, 0, lenOfString)>= 0
                         select feature)
                         .OrderBy(x => x.ColumnValues);
		Console.WriteLine("Feature: {0}", features.Count());
		foreach (Feature f in query)
		{
			i++;
			Console.WriteLine("|{1}| {0}", i, f.ColumnValues);
		}
	}
}

Fusione di più DataTable in uno

Si hanno più DataTable legati da chiavi di collegamento, si fondono in un unico finale. Seguono parti salienti ed esemplificative di un caso funzionante ottenibile qui per completezza
//...
dtFull = dsSourceFiles.Tables[arrFileToImport[0]].Clone(); //<-- Di Default E PER IPOTESI, il primo file è quello più importante con info pilota
//...
 
//CREAZIONE MATRICE dei valori da riporre nel nuovo DT omnicomprensivo
object[] emptyObj = new object[dsSourceFiles.Tables[arrFileToImport[1]].Columns.Count];
//...
 
//Prima MATRICE DI VALORI per la prima COPPIA di Files\Datatable da integrare per ogni file successivo al SECONDO
var rowData = from
      row1 in dsSourceFiles.Tables[arrFileToImport[0]].AsEnumerable()
join
      row2 in dsSourceFiles.Tables[arrFileToImport[1]].AsEnumerable()
on
      row1.Field<string>(sourceKeyFieldName0).Trim() equals row2.Field<string>(sourceKeyFieldName1).Trim() into row1X
from rowY in row1X.DefaultIfEmpty()
      select
            row1.ItemArray.Concat(rowY == null ? emptyObj : rowY.ItemArray).ToArray();
//...
 
//Costruisce l'insieme delle colonne di 2 File ovvero DataTable
var dt2Columns = dsSourceFiles.Tables[arrFileToImport[f]].Columns.OfType<DataColumn>()
      .Select(dc => new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
//..
 
rowData = from
     row1 in rowData
join
     row2 in dsSourceFiles.Tables[arrFileToImport[f]].AsEnumerable()
on
     row1[0] equals row2.Field<string>(sourceKeyFieldNameF).Trim() into row1X
from rowY in row1X.DefaultIfEmpty()
select
     row1.Concat(rowY == null ? new object[nrColSecondFile] : rowY.ItemArray).ToArray();
//...
 
//Riempimento DataTable con i Valori dai 2\n DataTable.       rowData    ha TUTTI i valori !!!
int rowInserted = 0;
int j = 0;
try
{
	if (!string.IsNullOrEmpty(strCSVAllPositionToRemove))
	{
		foreach (object[] values in rowData) //Riga definitiva con TUTTI i valori da porre nel DataTable DESTINAZIONE
		{
			j = 0;
			DataRow dr = dtFull.NewRow();
			for (int c = 0; c < values.Length; c++)
			{
				if (strCSVAllPositionToRemove.IndexOf("," + c + ",") < 0)
				{
					//string destinationColumnName = dictColMapping[ dr.Table.Columns[j].ColumnName];
					//dr[j] = TransformFieldValueByDestType(singleValue, destinationColumnName, dictColDestType, true);
					//string singleValue = values[c].ToString();
					dr[j] = values[c];
					j++;
				}
			}
			dtFull.Rows.Add(dr);
			rowInserted++;
		}
	}
//... etc etc ...

Operazioni su Array

Ricerche

Es. Ricerca con operatore insiemistico IN

Da [[1]].Supponendo di avere un array e volerlo filtrare in base ad una stringa CSV, in SQL basterebbe l'operatore IN invece...
Tecnica 1

string[] validNames = names.Split(';');
var query = customers.Where(c => validNames.Contains(c.FirstName));

Tecnica 2 Più performante

HashSet<string> validNames = new HashSet<string>(names.Split(';'));
var query = customers.Where(c => validNames.Contains(c.FirstName));

Tecnica 3 Usando una query expression:

var query = from c in customers
            where validNames.Contains(c.FirstName)
            select c;

Mappa e Links


C# | LinQ Teorici | LinQ


Applicazioni sui Dictionary