Zināšanu bāze

Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām

Sveicināti,

Jau kādu brīdi izmantoju LINQ veicot datu atlasi, grupēšanu, kārtošanu un tam līdzīgas lietas. Šoreiz gribēju apskatīt vienu klasisko uzdevuma atrisinājumu izmantojot LINQ iespējas.

Tātad, man ir noteikts importa fails. Parasts teksta fails, kurš sastāv no rindām, rindu saturs tiek dalīts ar sadalītāju(manā gadījumā – Tab). Pieņemsim, ka mums nav svarīgs datu ielasīšanas process, bet gan rindu apstrāde.

Piemērs,

var lines = new[]{ "Andrejs Mamontovs\t28\tmale", "Ivars Āriņš\t25\tmale" };

Atmiņā ir ielasīti divi ieraksti.  Pagrūti saprast, ko tad šīs rindiņas satur. Sāksim ar atšifrējumu. Katra rinda sadalīta uz trim daļām (Vārds Uzvārds, vecums, dzimums). Tātad, rindiņa ir jādala.

foreach (var line in lines)
{
    var parts = line.Split('\t');
}

Vērtība ar indeksu nulle būs Vārds Uzvārds. Vērtība ar indeksu viens būs vecums. Vērtība ar indeksu divi būs dzimums.

Console.WriteLine("Vārds Uzvārds: {0}", parts[0]);
Console.WriteLine("Vecums: {0}", parts[1]);
Console.WriteLine("Dzimums: {0}", parts[2]);

Iespējams šis ir pats izplatītākais veids, kā praksē tiek apstrādāti dati, bet man tāds nepatīk. Uzturēšanas ziņā neērti. Es vēlos izveidot noteiktu struktūru, ar atšifrējumu kas ir kas.

Pirmkārt, izveidoju  pārskaitījumu ar lauku nosaukumu.

public enum LineTags
{
    FullName,
    Age,
    Gender
}

Lauku apstrādes kodu var tagad pārrakstīt, lai tiek izmantots pārskaitījums

Console.WriteLine("Vārds Uzvārds: {0}", parts[(int)LineTags.FullName]);
Console.WriteLine("Vecums: {0}", parts[(int)LineTags.Age]);
Console.WriteLine("Dzimums: {0}", parts[(int)LineTags.Gender]);

Šinī gadījumā esam atteikušies no indeksiem, bet nav vel ideāli, ir nepieciešams pārskaitījumu tipu pārveidot uz tipu Integer. Šeit būtu pareizi izmantot Generic iespējas, lai simbolu kopas meklēšana notiktu pēc LineTags pārskaitījuma. Un šeit var noderēt LINQ konstrukcijas.

var parts = line.Split('\t').Select(
    (s, index) => new { Tag = (LineTags)index, Substring = s }).ToDictionary(
    c => c.Tag, c => c.Substring);

Vispirms ar Split sadalām rindu uz sastāvdaļām. Ar metodi Select visi masīva elementi (String  tips) tiek pārveidoti anonīmajā tipā. Tips satur divus laukus (Tag un Substring). Tag lauks tiek aizpildīts ar ieraksta indeksu. Ieraksta indekss ir Integer tips, to varam bez problēmām pārveidot par LineTags tipu. Substring lauks tiek aizpildīts ar oriģinālo simbolu kopu. Pēc šīs pārveidošanas iegūstam sarakstu ar jauno tipu. Noslēgumā jauno sarakstu pārveidot par vārdnīcu, kurā kā indeksi tiek izmantots tips LineTags.

Modificējam datu iegūšanas kodu

Console.WriteLine("Vārds Uzvārds: {0}", parts[LineTags.FullName]);
Console.WriteLine("Vecums: {0}", parts[LineTags.Age]);
Console.WriteLine("Dzimums: {0}", parts[LineTags.Gender]);

Kā redzam tikām vaļā no tipa pārveidošanas uz Integer. Kā arī tagad mums ir grūtāk kļūdīties atlasot datus. Šāds paņemies protams nebūt nav tas ātrākais, starpība ir aptuveni 5.5x reizes. Ir testēts uz aptuveni 100000 ierakstu.  Ja parastā apstrāde aizņēma ~100ms, tad gadījumā ar LINQ bija ~600ms. Protams, ir jāskatās pēc situācijas. Bet noteikti šis gadījums ir spējīgs dzīvot.

Cerams ka noderēs!

 


Posted Apr 01 2009, 09:33 AM by andrejs.mamontovs

Comments

valdis.iljuconoks wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-02-2009 8:00

labs!

ivars.arins wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-02-2009 9:26

Kā jau Tev klātienē teicu - zdorovo, no ņepoņjatno :) T.i., fīča izskatās jauka, bet LINQ izteiksmi ir pagrūti saprast.

andrejs.mamontovs wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-02-2009 10:47

Te es tev varu piekrist, jaunās valodu konstrukcijas sakumā ir pagrūti saprotamas

valdis.iljuconoks wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-02-2009 15:57

viss ir saprotams :)

tikai šajā pasākumā grūti saskatīt faila satura validācijas iespējas un risinājums strādās, ja datu avots ir nevainojamā kārtībā...

andrejs.mamontovs wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-02-2009 22:59

Šo tēmu var paturpināt ar kādu validācijas piemēru. Runājot par nevainojamu kārtību, tai ir jābūt, vismaz jābūt sakarībām, savādāk ir nopietni jāpārdomā vai tādus failus ir jāapstrādā.

Mr Anonymous wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-18-2009 23:25

LINQ ir uber laba fīča. Noder ne tikai predikātu veidošanai.

Šis ir must-read visiem .net`istiem:

www.amazon.com/.../1590597893

Andrejs Mamontovs wrote LINQ satiek PLINQ
on 05-05-2009 14:52

Sveicināti, Šoreiz īsi par Microsoft .NET Framework 4.0 paralēlisma iespēju strādājot ar LINQ izteiksmēm

Dolley wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 07-14-2011 12:13

THX that's a great anwesr!

Wilma wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 07-15-2011 19:26

I didn’t know where to find this info then kbaoom it was here.

buy google plus wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 03-22-2012 10:14

O70wio Enjoyed every bit of your article.Thanks Again.

oem software wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 05-02-2012 15:05

IyRQG2 Say, you got a nice blog.Really looking forward to read more. Great.

bookmarking wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 05-18-2012 8:06

UUqvs6 Great blog post. Much obliged.

Social Bookmarking Service wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-19-2012 16:35

bOok4v Awesome blog.Thanks Again. Fantastic.

amazing services wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 08-09-2012 0:40

k2IP4r I cannot thank you enough for the blog. Will read on...

oem software wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 08-17-2012 5:45

wuwxBw Enjoyed every bit of your article.Thanks Again. Really Great.

oem software wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 08-21-2012 9:31

x9EHHI Im thankful for the article post.Really thank you! Want more.

Social Bookmarking wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 08-30-2012 2:38

Thanks-a-mundo for the blog.Really thank you!

Hollister wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-06-2012 10:25

Really appreciate you sharing this blog article.Thanks Again. Cool.

Abercrombie Deutschland wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-06-2012 10:38

Enjoyed every bit of your blog.Thanks Again. Really Cool.

Abercrombie Bruxelles wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-06-2012 10:49

Really appreciate you sharing this blog. Will read on...

bingo no deposit wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-06-2012 10:59

I really enjoy the post.Thanks Again. Cool.

Ralph Lauren Sverige wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-06-2012 11:43

Major thanks for the post.Thanks Again. Cool.

bookmarking submission wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-09-2012 23:32

IxiDJm A big thank you for your post. Great.

bookmarking submission wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 09-24-2012 5:22

D4uHco Great blog post.Much thanks again. Cool.

crork wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 10-07-2012 4:19

puTktC Really enjoyed this article.Really looking forward to read more. Great.

bookmarking submission wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 10-29-2012 8:23

QeSIHN Wow, great article.Much thanks again. Keep writing.

bookmarking submission wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 11-07-2012 11:10

202UKJ Thanks so much for the blog post. Want more.

Seo Company wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 11-27-2012 19:05

4TsTat Thank you ever so for you blog post.Much thanks again. Much obliged.

viagra online wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 12-23-2012 6:56

zf9Q8R I really like and appreciate your blog.Thanks Again. Want more.

social bookmarking seo wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 01-18-2013 3:15

rLx1mB Really enjoyed this article post.Much thanks again. Great.

discount generic cialis wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 01-27-2013 11:43

ZP8Toq Thanks a lot for the blog.Really looking forward to read more. Will read on...

buy discount viagra wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 02-03-2013 7:52

BmmZSv Thanks so much for the article post.Thanks Again. Great.

les 3 suisses wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 02-11-2013 1:09

I really enjoy you do not on account of what you are, though on account of just who Now i'm agonizing morning together with. les 3 suisses www.b44.fr/lunettes-c-22.html

buy cialis wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 02-23-2013 18:10

NinmLQ Wow, great article post.

buy social bookmarks wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-03-2013 17:39

lGxQnI Major thanks for the post.Thanks Again. Will read on...

comedy wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-05-2013 23:34

Thanks for sharing, this is a fantastic article post.Really thank you! Great.

buy social bookmarks wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-08-2013 2:12

jpCk8B Awesome article.Really thank you! Keep writing.

buy social bookmarks wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 04-13-2013 15:10

ARUX7L Major thanks for the post. Really Great.

christian louboutin outlet store wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-03-2013 13:50

Try THESE Guys

gucci outlet store wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-03-2013 21:33

Click HERE

Snapback Hats For Sale wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-05-2013 22:32

Go To This Website

manolo blahnik wedding shoes wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-13-2013 9:11

Check These Guys Out

michael kors layton large shoulder tote wrote re: Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām
on 06-15-2013 6:06

thank you for share!

Add a Comment

(obligāts)  
(brīvizvēles)
(obligāts)  
Remember Me?