×
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
    )

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

184 page views in the last 30 days.
×