Linq in来自ObservableCollection中的ObservableCollection

时间:2017-06-07 09:04:35

标签: c# linq

我想要获得价值" thisValueIwant"。有没有可能让这个价值如此简单?或者也许这两个ObservableCollection有另一个解决方案

public class Foo
{
    public int number { get; set; }
    public ObservableCollection<FooInFoo> Details { get; set; }
}

public class FooInFoo
{
    public string thisValueIwant { get; set; }
}

public class TestClass
{
    public void Test()
    {
        ObservableCollection<Foo> FooCollection = new ObservableCollection<Foo>();

        FooCollection.Add(new Foo{
            number =1,
            Details = new ObservableCollection<FooInFoo>{ new FooInFoo {thisValueIwant = "very important string"}}
        });

        string x = (from f in FooCollection
                    where f.number == 1
                    select ???)
    }
}

3 个答案:

答案 0 :(得分:1)

由于ObservableCollection<FooInFoo> Details是一个集合,您必须决定所需的详细信息:第一个,最后一个,任何一个或全部。

假设您想要第一个:

var d = FooCollection.Where(f => f.Number == 1).FirstOrDefault()?.Details.FirstOrDefault()?.thisValueIwant;

或者最后一次:

var d = FooCollection.Where(f => f.Number == 1).FirstOrDefault()?.Details.LastOrDefault()?.thisValueIwant;

或全部(具体化为数组):

var ds = FooCollection.Where(f => f.Number == 1).FirstOrDefault()?.Details.Select(d => d.thisValueIwant).ToArray();

答案 1 :(得分:1)

ObservableCollection<T>是实现Collection<T>的{​​{1}}。因此,您的IEnumerable<T>是一个可观察的集合并不重要,您可以将其视为FooCollectionFooIEnumerable<Foo>

的序列

你的代码就像(抱歉,我只知道如何以方法格式编写) 在婴儿步骤:

IEnumerable<FooInFoo>

如果您确定只有一个继续:

IEnumerable<Foo> AllFooWithNumber1 = FooCollection
   .Where(foo => foo.Number == 1);

如果您不确定是否有SingleOrDefault,请考虑使用Enumerable.SelectMany

获得所需的Foo后,您可以选择详细信息:

Foo fooWithNumber1 = AllFooWithNumber1.Single();

或者在一个声明中:

IEnumerable<FooInFoo> detailsOfFooWithNumber1 = fooWithNumber1.Details;
FooInFoo detailIWant = detailsOfFooWithNumber1
   .Where(detail => some expression that uses detail...)
   .SingleOrDefault();

string thisValueIWant = defailtIWant.thisValueIWant;

如果您不确定是否有一个单一元素,可能会出现问题。

如果要检查给定值的foo.Number以及某个谓词的所有详细信息,请考虑使用{{3}}。只要序列序列(数组中的数组),就会使用它。使用SelectMany,您可以枚举所有这些内部数组,就像它是一个数组一样:

string thisValueIWant = FooCollection
   .Where(foo => foo.Number == 1)
   .Single()
   .Details
   .Where(detail => ...)
   .Single()
   .thisValueIWant;

答案 2 :(得分:0)

您可能需要我的ObservableComputations库。使用该库,您可以像这样进行编码:

Expression<Func<string>> expr = () => 
   FooCollection
      .Filtering(а => f.number == 1)
      .FirstComputing().Value
      .Using(f => f != null 
           ? f.Details.FirstComputing().Using(fif => 
               fif.Value != null ? fif.Value.thisValueIwant : null).Value
           : null).Value;

Computing<string> x = expr.Computing();

// x.Value is what you want

x是INotifyPropertyChanged,并通知您expr计算结果的变化。不要忘记使上面代码中提到的所有属性都通过INotifyPropertyChanged界面通知更改。