asp net core 2.0 mvc pdf : .Net merge pdf files control SDK utility azure wpf web page visual studio McGraw.Hill.CSharp.4.0.The.Complete.Reference.Apr.201062-part1224

594
Part I: The C# Language
The Query Methods
The query syntax described by the preceding sections is the way you will probably write 
, not the only way 
to write a query. The other way is to use the query methods. These methods can be called on 
any enumerable object, such as an array.
The Basic Query Methods
The query methods are defined by System.Linq.Enumerable and are implemented as 
extensionmethods that extend the functionality of IEnumerable<T>. (Query methods are 
also defined by System.Linq.Queryable, which extends the functionality of IQueryable<T>,
but this interface is not used in this chapter.) An extension method adds functionality to 
elatively 
new, being added by C# 3.0, and we will look more closely at them later in this chapter. For 
now, it is sufficient to understand that query methods can be called only on an object that 
implementsIEnumerable<T>.
TheEnumerable class provides many query methods, but at the core are those that 
correspond to the query keywords described earlier. These methods are shown here, along 
with the keywords to which they relate. Understand that these methods have overloaded 
forms and only their simplest form is shown. However, this is also the form that you will 
often use.
Query Keyword
Equivalent Query Method
select
Select(selector)
where
Where(predicate)
orderby
OrderBy(keySelector) or OrderByDescending(keySelector)
join
Join(innerouterKeySelectorinnerKeySelectorresultSelector)
group
GroupBy(keySelector)
Except for Join( ), these query methods take one argument, which is an object of some 
form of the generic type Func<T, TResult>. This is a built-in delegate type that is declared 
like this:
delegate TResult Func<in T, out TResult>(T arg)
Here, TResult specifies the result type of the delegate and T specifies the element type. 
In these query methods, the selector,predicate, or keySelector argument determines what 
action the query method takes. For example, in the case of Where( ), it determines how the 
query filters the data. Each of these query methods returns an enumerable object. Thus, 
the result of one can be used to execute a call on another, allowing the methods to be 
chained together.
TheJoin( ) method takes four arguments. The first is a reference to the second sequence 
to be joined. The first sequence is the one on which Join( ) is called. The key selector for the 
.Net merge pdf files - Merge, append PDF files in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Provide C# Demo Codes for Merging and Appending PDF Document
add pdf files together; reader combine pdf pages
.Net merge pdf files - VB.NET PDF File Merge Library: Merge, append PDF files in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
VB.NET Guide and Sample Codes to Merge PDF Documents in .NET Project
pdf combine pages; add two pdf files together
P
A
R
T
I
Chapter 19: LINQ 
595
P
A
R
T
I
P
A
R
T
I
first sequence is passed via outerKeySelector, and the key selector for the second sequence is 
passed via innerKeySelector. The result of the join is described by resultSelector. The type of 
outerKeySelector is Func<TOuter,TKey>, and the type of innerKeySelector is Func<TInner,
TKey>. The resultSelector argument is of type Func<TOuter,TInner,TResult>. Here, 
TOuter is the element type of the invoking sequence; TInner is the element type of the 
passed sequence; and TResult is the type of the resulting elements. An enumerable object 
is returned that contains the result of the join.
Although an argument to a query method such as Where( ) is a method compatible with 
the specified form of the Func delegate, it does not need to be an explicitly declared method. 
ession. As explained 
in Chapter 15, a lambda expression offers a streamlined, yet powerful way to define what 
is, essentially, an anonymous method. The C# compiler automatically converts a lambda 
expression into a form that can be passed to a Func parameter. Because of the convenience 
offered by lambda expressions, they are used by all of the examples in this section.
Create Queries by Using the Query Methods
By using the query methods in conjunction with lambda expressions, it is possible to create 
e called. Let’s 
begin with a simple example. It reworks the first program in this chapter so that it uses calls 
toWhere( ) and Select( ) rather than the query keywords.
// Use the query methods to create a simple query.
// This is a reworked version of the first program in this chapter.
using System;
using System.Linq;
class SimpQuery {
static void Main() {
int[] nums =  { 1, -2, 3, 0, -4, 5 };
// Use Where() and Select() to create a simple query.
var posNums = nums.Where(n => n > 0).Select(r => r);
Console.Write("The positive values in nums: ");
// Execute the query and display the results.
foreach(int i in posNums) Console.Write(i + " ");
Console.WriteLine();
}
}
The output, shown here, is the same as the original version:
The positive values in nums: 1 3 5
In the program, pay special attention to this line:
var posNums = nums.Where(n => n > 0).Select(r => r);
This creates a query called posNums that creates a sequence of the positive values in nums.
It does this by use of the Where( ) method (to filter the values) and Select( ) (to select the 
Online Merge PDF files. Best free online merge PDF tool.
Thus, C#.NET PDF document merge library control can be counted as an efficient .NET doc solution for keeping PDF document files organized. Download Free Trial.
c# merge pdf files; reader create pdf multiple files
VB.NET PDF Convert to HTML SDK: Convert PDF to html files in vb.
Converted HTML files preserve all the contents of source PDF file, like font style and anchors, in VB.NET class application. And
reader merge pdf; pdf combine
596
Part I: The C# Language
values). The Where( ) method can be invoked on nums because all arrays implement 
IEnumerable<T>, which supports the query extension methods.
Technically, the Select( ) method in the preceding example is not necessary because in 
this simple case, the sequence returned by Where( ) already contains the result. However, 
you can use mor
example, this query returns the positive values in nums increased by an order of magnitude:
var posNums = nums.Where(n => n > 0).Select(r => r * 10);
selects the positive values, sorts them into descending order, and returns the resulting 
sequence:
var posNums = nums.Where(n => n > 0).OrderByDescending(j => j);
Here, the expression j => j specifies that the ordering is dependent on the input parameter, 
which is an element from the sequence obtained from Where( ).
Here is an example that demonstrates the GroupBy( ) method. It reworks the group
example shown earlier.
// Demonstrate the GroupBy() query method.
// This program reworks the earlier version that used
// the query syntax.
using System;
using System.Linq;
class GroupByDemo {
static void Main() {
string[] websites = { "hsNameA.com", "hsNameB.net", "hsNameC.net",
"hsNameD.com", "hsNameE.org", "hsNameF.org",
"hsNameG.tv",  "hsNameH.net", "hsNameI.tv" };
// Use query methods to group websites by top-level domain name.
var webAddrs = websites.Where(w => w.LastIndexOf('.') != –1).
GroupBy(x => x.Substring(x.LastIndexOf(".")));
// Execute the query and display the results.
foreach(var sites in webAddrs) {
Console.WriteLine("Web sites grouped by " + sites.Key);
foreach(var site in sites)
Console.WriteLine("  " + site);
Console.WriteLine();
}
}
}
This version produces the same output as the earlier version. The only difference is how the 
query is created. In this version, the query methods are used.
Here is another example. Recall the join query used in the JoinDemo example shown 
earlier:
VB.NET PDF File Split Library: Split, seperate PDF into multiple
This is an VB.NET example of splitting a PDF to two new PDF files. You can use the following VB.NET demo to split PDF document to four files.
build pdf from multiple files; add pdf files together online
C# PDF Convert to SVG SDK: Convert PDF to SVG files in C#.net, ASP
file using C#. Instantly convert all PDF document pages to SVG image files in C#.NET class application. Perform high-fidelity PDF
acrobat merge pdf files; add pdf pages together
P
A
R
T
I
Chapter 19: LINQ 
597
P
A
R
T
I
P
A
R
T
I
var inStockList = from item in items
join entry in statusList
on item.ItemNumber equals entry.ItemNumber
select new Temp(item.Name, entry.InStock);
This query pr
stock status of an inventory item. This information is synthesized from joining the two lists 
items and statusList. The following version reworks this query so that it uses the Join( )
method rather than the C# query syntax:
// Use Join() to produce a list of item names and status.
var inStockList = items.Join(statusList,
k1 => k1.ItemNumber,
k2 => k2.ItemNumber,
(k1, k2) => new Temp(k1.Name, k2.InStock) );
Although this version uses the named class called Temp to hold the resulting object, an 
anonymous type could have been used instead. This approach is shown next:
var inStockList = items.Join(statusList,
k1 => k1.ItemNumber,
k2 => k2.ItemNumber,
(k1, k2) => new { k1.Name, k2.InStock} );
Query Syntax vs. Query Methods
As the preceding section has explained, C# has two ways of creating queries: the query 
syntax and the query methods. What is interesting, and not readily apparent by simply 
looking at a program’s source code, is that the two approaches are more closely related than 
you might at first assume. The reason is that the query syntax is compiled into calls to the 
query methods. Thus, when you write something like
where x < 10
the compiler translates it into
Where(x => x < 10)
Therefore, the two approaches to creating a query ultimately lead to the same place.
Given that the two approaches are ultimately equivalent, the following question 
naturally arises: Which approach is best for a C# program? The answer: In general, you 
by keywords and syntax, and is cleaner.
More Query-Related Extension Methods
In addition to the methods that correspond to the query keywords supported by C#, the 
.NET Framework provides several other query-related extension methods that are often 
helpful in a query. These query-related methods are defined for IEnumerable<T> by 
Enumerable. Here is a sampling of several commonly used methods. Because many of 
the methods are overloaded, only their general form is shown.
VB.NET PDF- HTML5 PDF Viewer for VB.NET Project
VB.NET convert PDF to Word, VB.NET extract text from PDF, VB.NET convert PDF to Jpeg, VB.NET compress PDF, VB.NET print PDF, VB.NET merge PDF files, VB.NET
pdf merge documents; acrobat split pdf into multiple files
VB.NET Create PDF from Word Library to convert docx, doc to PDF in
VB.NET convert PDF to Word, VB.NET extract text from PDF, VB.NET convert PDF to Jpeg, VB.NET compress PDF, VB.NET print PDF, VB.NET merge PDF files, VB.NET
c# merge pdf pages; add pdf together one file
598
Part I: The C# Language
Method
Description
All(predicate)
Returns true if all elements in a sequence satisfy a specified condition.
Any(predicate)
Returns true if any element in a sequence satisfies a specified condition.
Average( )
Returns the average of the values in a numeric sequence.
Contains(value)
Returns true if the sequence contains the specified object.
Count( )
Returns the length of a sequence. This is the number of elements that it 
contains.
First( )
Returns the first element in a sequence.
Last( )
Returns the last element in a sequence.
Max( )
Returns the maximum value in a sequence.
Min( )
Returns the minimum value in a sequence.
Sum( )
Returns the summation of the values in a numeric sequence.
You have already seen Count( ) in action earlier in this chapter. Here is a program that 
demonstrates the others:
// Use several of the extension methods defined by Enumerable.
using System;
using System.Linq;
class ExtMethods {
static void Main() {
int[] nums =  { 3, 1, 2, 5, 4 };
Console.WriteLine("The minimum value is " + nums.Min());
Console.WriteLine("The maximum value is " + nums.Max());
Console.WriteLine("The first value is " + nums.First());
Console.WriteLine("The last value is " + nums.Last());
Console.WriteLine("The sum is " + nums.Sum());
Console.WriteLine("The average is " + nums.Average());
if(nums.All(n => n > 0))
Console.WriteLine("All values are greater than zero.");
if(nums.Any(n => (n % 2) == 0))
Console.WriteLine("At least one value is even.");
if(nums.Contains(3))
Console.WriteLine("The array contains 3.");
}
}
The output is shown here:
VB.NET PDF Convert to SVG SDK: Convert PDF to SVG files in vb.net
PDF; Merge PDF Files; Split PDF Document; Remove Password from PDF; Change PDF Permission Settings. FREE TRIAL: HOW TO: XDoc.HTML5 Viewer for C#▶: C# ASP.NET:
pdf split and merge; batch merge pdf
C# PDF Convert to Text SDK: Convert PDF to txt files in C#.net
content of target PDF document can be copied and pasted to .txt files by keeping original layout. C#.NET class source code for converting each PDF document page
append pdf; pdf merge files
P
A
R
T
I
Chapter 19: LINQ 
599
P
A
R
T
I
P
A
R
T
I
The minimum value is 1
The maximum value is 5
The first value is 3
The last value is 4
The sum is 15
The average is 3
All values are greater than zero.
At least one value is even.
The array contains 3.
You can also use the query-related extension methods within a query based on the C# 
query syntax. In fact, it is quite common to do so. For example, this program uses Average( )
to obtain a sequence that contains only those values that are less than the average of the 
values in an array.
// Use Average() with the query syntax.
using System;
using System.Linq;
class ExtMethods2 {
static void Main() {
int[] nums =  { 1, 2, 4, 8, 6, 9, 10, 3, 6, 7 };
var ltAvg = from n in nums
let x = nums.Average()
where n < x
select n;
Console.WriteLine("The average is " + nums.Average());
Console.Write("These values are less than the average: ");
// Execute the query and display the results.
foreach(int i in ltAvg) Console.Write(i + " ");
Console.WriteLine();
}
}
The output is shown here:
The average is 5.6
These values are less than the average: 1 2 4 3
Pay special attention to the query:
var ltAvg = from n in nums
let x = nums.Average()
where n < x
select n;
Notice in the let statement, x is set equal to the average of the values in nums. This value is 
obtained by calling Average( ) on nums.
600
Part I: The C# Language
Deferred vs. Immediate Query Execution
In LINQ, queries have two different modes of execution: immediate and deferred. As 
explained early in this chapter, a query defines a set of rules that are not actually executed 
until a foreach statement executes. This is called deferredexecution.
However, if you use one of the extension methods that produces a non-sequence result, 
then the query must be executed to obtain that result. For example, consider the Count( )
method. In order for Count( ) to return the number of elements in the sequence, the query 
must be executed, and this is done automatically when Count( ) is called. In this case, 
immediateexecution takes place, with the query being executed automatically in order to 
obtain the result. Therefore, even though you don’t explicitly use the query in a foreach
loop, the query is still executed.
Her
// Use immediate execution.
using System;
using System.Linq;
class ImmediateExec {
static void Main() {
int[] nums =  { 1, -2, 3, 0, -4, 5 };
// Create a query that obtains the number of positive
// values in nums.
int len = (from n in nums
where n > 0
select n).Count();
}
}
The output is
The number of positive values in nums: 3
In the program, notice that no explicit foreach loop is specified. Instead, the query 
automatically executes because of the call to Count( ).
As a point of interest, the query in the preceding program could also have been written 
like this:
var posNums = from n in nums
where n > 0
select n;
int len = posNums.Count(); // query executes here
In this case, Count( ) is called on the query variable. At that point, the query is executed to 
obtain the count.
Other methods that cause immediate execution of a query include ToArray( ) and 
ToList( ). Both are extension methods defined by Enumerable.ToArray( ) returns the results 
P
A
R
T
I
Chapter 19: LINQ 
601
P
A
R
T
I
P
A
R
T
I
of a query in an array. ToList( ) returns the results of a query in the form of a List collection. 
the results. For example, the following sequence obtains an array of the results generated by 
theposNums query just shown. It then displays the results.
int[] pnums = posNum.ToArray(); // query executes here
foreach(int i in pnums)
Console.Write(i + " ");
}
Expression Trees
Another LINQ-related feature is the expression tree. An expression tree is a representation 
of a lambda expression as data. Thus, an expression tree, itself, cannot be executed. It can, 
however, be converted into an executable form. Expression trees are encapsulated by the 
System.Linq.Expressions.Expression<TDelegate> class. Expression trees are useful in 
situations in which a query will be executed by something outside the program, such as a 
database that uses SQL. By representing the query as data, the query can be converted into a 
format understood by the database. This process is used by the LINQ to SQL feature provided 
by Visual C#, for example. Thus, expression trees help C# support a variety of data sources.
You can obtain an executable form of an expression tree by calling the Compile( )
method defined by Expression. It returns a reference that can be assigned to a delegate and 
then executed. You can declare your own delegate type or use one of the predefined Func
delegate types defined within the System namespace. Two forms of the Func delegate were 
mentioned earlier, when the query methods were described, but there are several others.
Expression trees have one key restriction: Only expression lambdas can be represented 
by expression trees. They cannot be used to represent statement lambdas.
Here is a simple example of an expression tree in action. It creates an expression tree 
whose data represents a method that determines if one integer is a factor of another. It then 
compiles the expression tree into executable code. Finally, it demonstrates the compiled code.
// A simple expression tree.
using System;
using System.Linq;
using System.Linq.Expressions;
class SimpleExpTree {
static void Main() {
// Represent a lambda expression as data.
Expression<Func<int, int, bool>>
IsFactorExp = (n, d) => (d != 0) ? (n % d) == 0 : false;
// Compile the expression data into executable code.
Func<int, int, bool> IsFactor = IsFactorExp.Compile();
// Execute the expression.
if(IsFactor(10, 5))
Console.WriteLine("5 is a factor of 10.");
if(!IsFactor(10, 7))
602
Part I: The C# Language
Console.WriteLine("7 is not a factor of 10.");
Console.WriteLine();
}
}
The output is shown here:
5 is a factor of 10.
7 is not a factor of 10.
The program illustrates the two key steps in using an expression tree. First, it creates an 
expression tree by using this statement:
Expression<Func<int, int, bool>>
IsFactorExp = (n, d) => (d != 0) ? (n % d) == 0 : false;
This constructs a representation of a lambda expression in memory. As explained, this 
representation is data, not code. This representation is referred to by IsFactorExp. The 
following statement converts the expression data into executable code:
Func<int, int, bool> IsFactor = IsFactorExp.Compile();
After this statement executes, the IsFactor delegate can be called to determine if one value is 
a factor of another.
One other point: Notice that Func<int, int, bool> indicates the delegate type. This form 
ofFunc specifies two parameters of type int and a return type of bool. This is the form of 
Func that is compatible with the lambda expression used in the program because that 
expression requires two parameters. Other lambda expressions may require different forms 
ofFunc, based on the number of parameters they require. In general, the specific form of 
Func must match the requirements of the lambda expression.
Extension Methods
As mentioned earlier, extension methods provide a means by which functionality can be 
added to a class without using the normal inheritance mechanism. Although you won’t 
often create your own extension methods (because the inheritance mechanism offers a 
because of their integral importance to LINQ.
method can be called. Furthermore, the first parameter must be modified by this. The object on 
. It is not explicitly 
passed in the argument list. A key point is that even though an extension method is declared 
static, it can still be called on an object, just as if it were an instance method.
Here is the general form of an extension method:
staticret-typename(thisinvoked-on-typeob,param-list)
P
A
R
T
I
Chapter 19: LINQ 
603
P
A
R
T
I
P
A
R
T
I
Of course, if there are no arguments other than the one passed implicitly to ob, then param-list
will be empty. Remember, the first parameter is automatically passed the object on which 
Here is an example that creates three simple extension methods:
// Create and use some extension methods.
using System;
using System.Globalization;
static class MyExtMeths {
// Return the reciprocal of a double.
public static double Reciprocal(this double v) {
return 1.0 / v;
}
// Reverse the case of letters within a string and
// return the result.
public static string RevCase(this string str) {
string temp = "";
foreach(char ch in str) {
else temp += Char.ToLower(ch, CultureInfo.CurrentCulture);
}
return temp;
}
// Return the absolute value of n / d.
public static double AbsDivideBy(this double n, double d) {
return Math.Abs(n / d);
}
}
class ExtDemo {
static void Main() {
double val = 8.0;
string str = "Alpha Beta Gamma";
// Call the Reciprocal() extension method.
Console.WriteLine("Reciprocal of {0} is {1}",
val, val.Reciprocal());
// Call the RevCase() extension method.
Console.WriteLine(str + " after reversing case is " +
str.RevCase());
// Use AbsDivideBy();
Console.WriteLine("Result of val.AbsDivideBy(-2): " +
val.AbsDivideBy(-2));
}
}
Documents you may be interested
Documents you may be interested