Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编写一个简单的LINQ查询_C#_Wpf_Linq - Fatal编程技术网

C# 编写一个简单的LINQ查询

C# 编写一个简单的LINQ查询,c#,wpf,linq,C#,Wpf,Linq,因此,我一直生活在一个黑暗的时代,反复浏览我的数据,以老式的方式找到我感兴趣的东西,但这个项目我认为我应该让事情变得更优雅,在我知道可以使用LINQ的地方使用LINQ,但事情并不是很顺利 因此,我有两个简单的ObservableCollection,我想从其中一个中提取与另一个的当前选定项匹配的所有数据。对象非常简单 public class foo { //.... public string barID{ get; set; } //.... } public cl

因此,我一直生活在一个黑暗的时代,反复浏览我的数据,以老式的方式找到我感兴趣的东西,但这个项目我认为我应该让事情变得更优雅,在我知道可以使用LINQ的地方使用LINQ,但事情并不是很顺利

因此,我有两个简单的ObservableCollection,我想从其中一个中提取与另一个的当前选定项匹配的所有数据。对象非常简单

public class foo
{
    //....
    public string barID{ get; set; }
    //....
}

public class bar
{
    public string ID { get; set; }
    //....
}
因此,在我的代码中,我选择了foo,我想创建一个包含匹配barID的所有bar的集合

ObservableCollection<bar> bars = 
    from data in fooCollection
    where data.barID == barCollection.SelectedItem.ID
    select data;
因此,我确信我可以在事实发生后投射对象或做其他事情,但我正在寻找一个尽可能优雅的解决方案,因此,如果能帮我将这个简单的LINQ语句组合在一起,我将不胜感激。另外,对幕后发生的事情的简单解释将极大地帮助我理解LINQ的一些基础知识。

您只需使用

发生的事情基本上是:

IEnumerable<bar> barEnumerable = 
fooCollection.Where(data => data.barID == barCollection.SelectedItem.ID);
你只要用这个

发生的事情基本上是:

IEnumerable<bar> barEnumerable = 
fooCollection.Where(data => data.barID == barCollection.SelectedItem.ID);

您可以简单地使用var作为条形图类型:

var bars = from data in fooCollection
where data.barID == fooCollection.SelectedItem.ID
select data;

您可以简单地使用var作为条形图类型:

var bars = from data in fooCollection
where data.barID == fooCollection.SelectedItem.ID
select data;

强制转换会更改表达式的类型,如果表达式确实是该类型,则可以使用强制转换

考虑类Customer:Person

由于可能出现异常,在我的代码中,向下转换非常罕见。让我们花一点时间来感谢泛泛之辈使之成为可能。好的,关于转换:

转换从旧实例创建所需类型的新实例

Customer c4 = new Customer(p); //conversion constructor
Customer c5 = p.ToCustomer(); //conversion method
Customer c6 = (Customer) p; // if defined, implicit conversion. Otherwise, casting
                            // yes, casting and implicit conversion are the same syntax
                            // terribly confusing.
我们从异常消息中知道,查询返回的实例是WhereEnumerableIterator

这个结果实例不是数组,也不是列表,也不是ObservableCollection。强制转换无法工作,因为ObservaleCollection不会从WhereEnumerableTerator继承。如果您想从中获得一个ObservableCollection,则需要转换


在语法背后,该查询调用Enumerable.Where,它返回IEnumerable。从该类型转换为所需类型的最简单方法是使用for ObservaleCollection。

强制转换更改表达式的类型,如果表达式确实是该类型,则它将起作用

考虑类Customer:Person

由于可能出现异常,在我的代码中,向下转换非常罕见。让我们花一点时间来感谢泛泛之辈使之成为可能。好的,关于转换:

转换从旧实例创建所需类型的新实例

Customer c4 = new Customer(p); //conversion constructor
Customer c5 = p.ToCustomer(); //conversion method
Customer c6 = (Customer) p; // if defined, implicit conversion. Otherwise, casting
                            // yes, casting and implicit conversion are the same syntax
                            // terribly confusing.
我们从异常消息中知道,查询返回的实例是WhereEnumerableIterator

这个结果实例不是数组,也不是列表,也不是ObservableCollection。强制转换无法工作,因为ObservaleCollection不会从WhereEnumerableTerator继承。如果您想从中获得一个ObservableCollection,则需要转换


在语法背后,该查询调用Enumerable.Where,它返回IEnumerable。从该类型转换为所需类型的最简单方法是使用for ObservableCollection。

任何特定原因都可以,但是强制转换会引发错误?因为查询的输出是可枚举的,而不是可观察集合,所以您需要从可枚举构造可观察集合。@KDiTraglia转换和强制转换是两件截然不同的事情。Casting告诉编译器,我知道你认为这个变量是一个X,但我碰巧比你更清楚,知道它实际上是一个Y,把它放在一个Y类型的变量中。如果这个变量实际上不是一个Y,它就会崩溃。转换就是说,这里有一些代码,当给定一个Y作为输入时,将返回一个X作为输出,从而为您提供一个您想要的类型的全新值。因为您确实有一个IEnumerable,它不是ObservableCollection,所以您需要转换它,而不是强制转换它。@Servy,这是一个很好的解释,只是ObservableCollection没有实现IObservable。@KDiTraglia不总是,但通常是的。您没有修改在上使用LINQ方法的任何内容,并且通常不会得到相同类型的新集合。你只需要一个IEnumerable或者一个迭代器就可以了。例外情况是ToArray、ToList等方法,首先是它们返回的扩展IEnumerable接口的所有排序方法,聚合方法min/max/average,但是强制转换会引发错误?因为查询的输出是可枚举的,而不是可观察集合,所以您需要从可枚举构造可观察集合。@KDiTraglia转换和强制转换是两件截然不同的事情。Casting告诉编译器,我知道你认为这个变量是一个X,但我碰巧比你更清楚,知道它实际上是一个Y,把它放在一个Y类型的变量中。如果这个变量实际上不是一个Y,它就会崩溃。对流
ting说,这里有一些代码,当输入Y时,将返回X作为输出,从而为您提供一个您想要的类型的全新值。因为您确实有一个IEnumerable,它不是ObservableCollection,所以您需要转换它,而不是强制转换它。@Servy,这是一个很好的解释,只是ObservableCollection没有实现IObservable。@KDiTraglia不总是,但通常是的。您没有修改在上使用LINQ方法的任何内容,并且通常不会得到相同类型的新集合。你只需要一个IEnumerable或者一个迭代器就可以了。例外情况是ToArray、ToList等方法,首先是它们返回接口的所有排序方法,这些接口扩展了IEnumerable,即聚合方法min/max/average,它们只是将问题推到后面;最终,LINQ查询的IEnumerable结果必须转化为ObservableCollection。当然,但有时甚至不需要知道它。取决于您想要对结果执行的操作,例如,使用foreach的简单枚举不需要任何强制转换,因为只需要IEnumerable。除了他说他想要一个ObservableCollection之外。这不是一个,它也没有实现INotifyCollectionChanged或INotifyPropertyChanged。var主要用于当您知道要键入的内容时,只需键入较少的字符。不是把问题掩盖起来,而是把问题推到后面;最终,LINQ查询的IEnumerable结果必须转化为ObservableCollection。当然,但有时甚至不需要知道它。取决于您想要对结果执行的操作,例如,使用foreach的简单枚举不需要任何强制转换,因为只需要IEnumerable。除了他说他想要一个ObservableCollection之外。这不是一个,它也没有实现INotifyCollectionChanged或INotifyPropertyChanged。var主要用于当您知道要键入的内容时,只需键入较少的字符。这并不是要掩盖类型问题。
Customer c4 = new Customer(p); //conversion constructor
Customer c5 = p.ToCustomer(); //conversion method
Customer c6 = (Customer) p; // if defined, implicit conversion. Otherwise, casting
                            // yes, casting and implicit conversion are the same syntax
                            // terribly confusing.