CSharp:Esempi LinQ
From Aino Wiki
Contents
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