Linq 入门系列 [OfType,ToArray,ToList,ToDictionary]

本文介绍了 LINQ 中的 OfType, ToList, ToArray 和 ToDictionary 操作符的使用方法。通过对具体示例的解析,展示了如何利用这些操作符进行数据筛选、缓存结果和转换数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

None.gif先说点理论
None.gif
1.OfType :
None.gif     即接受基于IEnumerable
<T> 接口的信息源,也接受那些在 .NET Framework 1.0 中出现的非参数化的 IEnumerable 接口(non-parameterized IEnumerable interface)。OfType 操作符允许用户在标准的 .NET collections 类(classic .NET collections)上应用标准查询操作符,就像下面的程序:
None.gif
None.gif代码:
None.gifIEnumerable classic 
= new OlderCollectionType();
None.gifIEnumerable
<object> modern = classic.OfType<object>();
None.gif
None.gif
None.gif在这个例子中,变量 modern 产生了与变量 classic 一样的顺序的数据列表(same sequence of values),但是不同的是它的类型兼容最新的 IEnumerable
<T> 代码(modern IEnumerable<T> code),包括标准查询操作符。
None.gif
None.gifOfType 操作符对新的信息源也是有用的,因为它允许从基于类型的信息源(source based on type)中过滤出数据(filtering values from)。当要制作新的顺序的时候(producing the 
new sequence),OfType 简单的忽略(omits)原有序列的成员(members of the original sequence)就可以了,这是与类型实参(type argument)不相符的。分析下面的程序,目标是将 string 字符串数据从一个有不同种类数据的数组(heterogeneous array)中分解出来:
None.gif
None.gif代码:
ExpandedBlockStart.gifContractedBlock.gif
object[] vals = dot.gif1"Hello"true"World"9.1 };
None.gifIEnumerable
<string> justStrings = vals.OfType<string>();
None.gif
None.gif
None.gif当在 
foreach 语句中列举(enumerate)变量 justStrings 中的数据时,将得到两个依次为“Hello”和“World”的 string 字符串序列(a sequence of two strings )。
None.gif
None.gif
None.gif
2.ToList,ToArray:
None.gif  对应用程序想缓存查询赋值的结果,ToList 和 ToArray 这两个操作符提供用来强制查询的直接赋值(force the immediate evaluation),以返回一个含有查询赋值的结果的 List
<T> 或者Array 数组。
None.gif为了解延迟查询赋值是怎么工作的,请考察下面一段简单地查询一个数组的程序:
None.gif
None.gif代码:
None.gif
// declare a variable containing some strings
ExpandedBlockStart.gifContractedBlock.gif
string[] names = dot.gif"Allen""Arthur""Bennett" };
None.gif
None.gif
// declare a variable that represents a query
None.gif
IEnumerable<string> ayes = names.Where(s => s[0== 'A');
None.gif
None.gif
// evaluate the query
None.gif
foreach (string item in ayes)
None.gif  Console.WriteLine(item);
None.gif
None.gif
// modify the original information source
None.gif
names[0= "Bob";
None.gif
None.gif
// evaluate the query again, this time no "Allen"
None.gif
foreach (string item in ayes)
None.gif    Console.WriteLine(item);
None.gif
None.gif
None.gif查询在每次变量 ayes 迭代结束(iterated over)时赋值。为了显示需要对结果做一份缓存的copy,我们可以简单给这个查询附加上一个 ToList 或 一个 ToArray 操作符,如下所示:
None.gif
None.gif代码:
None.gif
// declare a variable containing some strings
ExpandedBlockStart.gifContractedBlock.gif
string[] names = dot.gif"Allen""Arthur""Bennett" };
None.gif
None.gif
// declare a variable that represents the result
None.gif
// of an immediate query evaluation
None.gif
string[] ayes = names.Where(s => s[0== 'A').ToArray();
None.gif
None.gif
// iterate over the cached query results
None.gif
foreach (string item in ayes)
None.gif    Console.WriteLine(item);
None.gif
None.gif
// modifying the original source has no effect on ayes
None.gif
names[0= "Bob";
None.gif
None.gif
// iterate over result again, which still contains "Allen"
None.gif
foreach (string item in ayes)
None.gif    Console.WriteLine(item);
None.gif
None.gif
None.gifToList 和 ToArray 都强制查询的赋值,就像执行一个标准查询操作符(如 First, ElementAt, Sum, Average, All, 等)返回一个单独的值(singleton values)一样。
None.gif
None.gif
None.gifToArray:
ExpandedBlockStart.gifContractedBlock.gif
public void ToArray() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
double[] doubles = dot.gif1.72.31.94.12.9 };
InBlock.gif    var sortedDoubles 
=
InBlock.gif        from d 
in doubles
InBlock.gif        orderby d descending
InBlock.gif        select d;
InBlock.gif    var doublesArray 
= sortedDoubles.ToArray();
InBlock.gif
InBlock.gif    Console.WriteLine(
"Every other double from highest to lowest:");
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for (int d = 0; d < doublesArray.Length; d += 2dot.gif{
InBlock.gif        Console.WriteLine(doublesArray[d]);
ExpandedSubBlockEnd.gif    }
 
ExpandedBlockEnd.gif}

None.gif
None.gifToList:
ExpandedBlockStart.gifContractedBlock.gif
public void ToList() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
string[] words = dot.gif"cherry""apple""blueberry" };
InBlock.gif    var sortedWords 
=
InBlock.gif        from w 
in words
InBlock.gif        orderby w
InBlock.gif        select w;
InBlock.gif    var wordList 
= sortedWords.ToList();
InBlock.gif    Console.WriteLine(
"The sorted word list:");
ExpandedSubBlockStart.gifContractedSubBlock.gif    
foreach (var w in wordList) dot.gif{
InBlock.gif        Console.WriteLine(w);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gifToDictionary:
ExpandedBlockStart.gifContractedBlock.gif
public void ToDictionary() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    var scoreRecords 
= new [] dot.gifnew dot.gif{Name = "Alice", Score = 50},
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
new dot.gif{Name = "Bob" , Score = 40},
ExpandedSubBlockStart.gifContractedSubBlock.gif                                
new dot.gif{Name = "Cathy", Score = 45}
ExpandedSubBlockEnd.gif                              }
;
InBlock.gif    var scoreRecordsDict 
= scoreRecords.ToDictionary(sr => sr.Name);
InBlock.gif    Console.WriteLine(
"Bob's score: {0}", scoreRecordsDict["Bob"]);
ExpandedBlockEnd.gif}

None.gif
None.gifOfType:
ExpandedBlockStart.gifContractedBlock.gif
public void OfType() dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
object[] numbers = dot.gifnull1.0"two"34.0f5"six"7.0 };
InBlock.gif    var doubles 
= numbers.OfType<double>();
InBlock.gif    Console.WriteLine(
"Numbers stored as doubles:");
ExpandedSubBlockStart.gifContractedSubBlock.gif    
foreach (var d in doubles) dot.gif{
InBlock.gif        Console.WriteLine(d);
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gifToArray:Result
None.gif
None.gifEvery other double from highest to lowest:
None.gif
None.gif4.1
None.gif2.3
None.gif1.7
None.gif
None.gifToList:Result
None.gif
None.gifThe sorted word list:
None.gif
None.gifapple
None.gifblueberry
None.gifcherry
None.gif
None.gifToDictionary:Result
None.gif
None.gifBob's score: {Name=Bob, Score=40}
None.gif
None.gifOfType:Result
None.gif
None.gifNumbers stored as doubles:
None.gif
None.gif1
None.gif7
None.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值