×
Namespaces

Variants
Actions
(Difference between revisions)

Windows Phone 通过Orderby与Count熟悉lamda

From Nokia Developer Wiki
Jump to: navigation, search
Vincent-DEVDIV (Talk | contribs)
(Vincent-DEVDIV -)
Aady (Talk | contribs)
(Aady -)
(6 intermediate revisions by 3 users not shown)
Line 1: Line 1:
[[Category:Draft]][[Category:Windows Phone 8]][[Category:Windows Phone 7.5]]
+
[[Category:Windows Phone 8]][[Category:Windows Phone 7.5]][[Category:Lang-Chinese]][[Category:General Programming]][[Category:Windows Phone]]
 +
{{ArticleMetaData <!-- v1.2 -->
 +
|sourcecode= <!-- Link to example source code e.g. [[Media:The Code Example ZIP.zip]] -->
 +
|installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) -->
 +
|devices= <!-- Devices tested against - e.g. ''devices=Nokia 6131 NFC, Nokia C7-00'') -->
 +
|sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Qt SDK 1.1.4]) -->
 +
|platform= <!-- Compatible platforms - e.g. Symbian^1 and later, Qt 4.6 and later -->
 +
|devicecompatability= <!-- Compatible devices e.g.: All* (must have internal GPS) -->
 +
|dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 -->
 +
|signing= <!-- Signing requirements - empty or one of: Self-Signed, DevCert, Manufacturer -->
 +
|capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. -->
 +
|keywords= <!-- APIs, classes and methods (e.g. QSystemScreenSaver, QList, CBase -->
 +
|language= <!-- Language category code for non-English topics - e.g. Lang-Chinese -->
 +
|translated-by= <!-- [[User:XXXX]] -->
 +
|translated-from-title= <!-- Title only -->
 +
|translated-from-id= <!-- Id of translated revision -->
 +
|review-by= <!-- After re-review: [[User:username]] -->
 +
|review-timestamp= <!-- After re-review: YYYYMMDD -->
 +
|update-by= <!-- After significant update: [[User:username]]-->
 +
|update-timestamp= <!-- After significant update: YYYYMMDD -->
 +
|creationdate= 20130130
 +
|author= [[User:Vincent-DEVDIV]]
 +
}}
 +
 
 
有人问题这个问题,这里总结一下,以便新人查询
 
有人问题这个问题,这里总结一下,以便新人查询
  
 
问题是ObservableCollection的OrderBy和Count很难理解:
 
问题是ObservableCollection的OrderBy和Count很难理解:
[代码]c#/cpp/oc代码:
+
<code csharp>
[code]
+
 
ObservableCollection<string> oc = new ObservableCollection<string>();
 
ObservableCollection<string> oc = new ObservableCollection<string>();
 
oc.Add("abc");
 
oc.Add("abc");
Line 12: Line 34:
 
var oc2 = oc.OrderBy(item => item);
 
var oc2 = oc.OrderBy(item => item);
 
int count = oc.Count(item => item == "beijing");
 
int count = oc.Count(item => item == "beijing");
[/code]
+
</code>
  
 
解答:
 
解答:
  
1. lambda表达式的格式一般是
+
# lambda表达式的格式一般是
(input parameters) => expression
+
#: (input parameters) => expression
他们构成了类似一个函数,expression那里就是返回值
+
#: 他们构成了类似一个函数,括号里面的是参数,如果参数只有一个那么括号可以省略,=》符号右侧是expression,要执行的代码,expression的结果就是返回值
 
+
# 比如item => item,那么参数是item,表达式和返回值都是item
2. 比如item => item,那么参数是item,表达式和返回值都是item
+
#: 通过VS的Goto Definition看OrderBy的定义,它要求第一个参数是IEnumerable,第二个参数是Func<TSource, TKey> keySelector
再看OrderBy的定义,它要求参数是Func<TSource, TKey> keySelector
+
#: 也就是说它希望的参数是一个func,这个func的返回值是排序的key,
也就是说它希望的参数是一个func,这个func的返回值是排序的key,
+
#: 而你的func是item=>item,它的返回值是item,所以key就是item。
而你的func是item=>item,它的返回值是item,所以key就是item。
+
# 在来看item=>item=="beijing",它的参数是item,表达式是item=="beijing",返回值是bool(true/false)
 
+
#: 再看Count的定义,它要求第二个参数为Func<TSource, bool> predicate
3. 在来看item=>item=="beijing",它的参数是item,表达式是item=="beijing",返回值是bool(true/false)
+
#: 也就是说它希望参数是一个func,这个func的返回值是bool,是一个Predicate。
再看Count的定义,它要求参数为Func<TSource, bool> predicate
+
#: 总结一下就是:
也就是说它希望参数是一个func,这个func的返回值是bool,是一个Predicate。
+
#: <code csharp>public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);</code>
就是说
+
#: 这个函数,枚举source中每一个item,然后调用func检查item是否符合条件,如果符合条件就计数加1.
public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
+
# 另外需要指出的是Func定义为:
这个函数,枚举source中每一个item,然后调用func检查item是否符合条件,如果符合条件就计数加1.
+
#: <code csharp>
 
+
4. 另外需要只出的是Func定义为:
+
 
public delegate TResult Func<in T, out TResult>(
 
public delegate TResult Func<in T, out TResult>(
 
         T arg
 
         T arg
 
)
 
)
 +
</code>
 
也就是说模板中第一个是参数,第二个是返回值。
 
也就是说模板中第一个是参数,第二个是返回值。

Revision as of 22:22, 15 February 2013

WP Metro Icon WP8.png
SignpostIcon WP7 70px.png
SignpostIcon Code 52.png
Article Metadata
CompatibilityArticle
Created: Vincent-DEVDIV (30 Jan 2013)
Last edited: Aady (15 Feb 2013)

有人问题这个问题,这里总结一下,以便新人查询

问题是ObservableCollection的OrderBy和Count很难理解:

ObservableCollection<string> oc = new ObservableCollection<string>();
oc.Add("abc");
oc.Add("dec");
oc.Add("zhongguo");
oc.Add("beijing");
var oc2 = oc.OrderBy(item => item);
int count = oc.Count(item => item == "beijing");

解答:

  1. lambda表达式的格式一般是
    (input parameters) => expression
    他们构成了类似一个函数,括号里面的是参数,如果参数只有一个那么括号可以省略,=》符号右侧是expression,要执行的代码,expression的结果就是返回值
  2. 比如item => item,那么参数是item,表达式和返回值都是item
    通过VS的Goto Definition看OrderBy的定义,它要求第一个参数是IEnumerable,第二个参数是Func<TSource, TKey> keySelector
    也就是说它希望的参数是一个func,这个func的返回值是排序的key,
    而你的func是item=>item,它的返回值是item,所以key就是item。
  3. 在来看item=>item=="beijing",它的参数是item,表达式是item=="beijing",返回值是bool(true/false)
    再看Count的定义,它要求第二个参数为Func<TSource, bool> predicate
    也就是说它希望参数是一个func,这个func的返回值是bool,是一个Predicate。
    总结一下就是:
    public static int Count<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
    这个函数,枚举source中每一个item,然后调用func检查item是否符合条件,如果符合条件就计数加1.
  4. 另外需要指出的是Func定义为:
    public delegate TResult Func<in T, out TResult>(
    T arg
    )

也就是说模板中第一个是参数,第二个是返回值。

172 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×