2010-12-07 24 views
1

私は次のXMLを持っており、特定の統計を通過するときにYe​​arとReturn_Valueを抽出するクエリが必要です。linq xmlステートメントで2つのwhere節を持つ方法

ディクショナリオブジェクトの1つのadd文で2つのwhere節を持つことができないため、現在のコードは機能しません。これには解決策がありますか?

foreach (var row in rows) 
{ 
    myHoldingsDistribution.Add(row.Descendants() 
     .Where(y => y.Name.LocalName == keyName) 
     .Select(q => q.Value).Max(), 
     Double.Parse(row.Descendants().Where(y => y.Name.LocalName == valueName) 
          .Select(q => q.Value).Max()) * multiplier); 

<Table> 
    <Year>1</Year> 
    <Statistic>0 Percentile</Statistic> 
    <Return_Value>0.0535644000000</Return_Value> 
</Table> 
    base {System.Xml.Linq.XContainer}: <Table> 
    <ALMRunResults_Year>1</ALMRunResults_Year> 
    <Statistic>0 Percentile</Statistic> 
    <Return_Value>0.0535644000000</Return_Value> 
</Table> 

FirstAttribute: null 
    HasAttributes: false 
    HasElements: true 
    IsEmpty: false 
    LastAttribute: null 
    Name: {Table} 
    NodeType: Element 
    Value: "10 Percentile0.0535644000000" 

編集

次の文で - 私は、理想的には1パーセンタイルでないものをフィルタリングするために二回.whereたいと思います。

myHoldingsDistribution.Add(row.Descendants() 
     .Where(y => y.Name.LocalName == keyName) 
     .Select(q => q.Value).Max(), 
     Double.Parse(row.Descendants().Where(y => y.Name.LocalName == valueName) 
          .Select(q => q.Value).Max()) * multiplier); 
+0

「どこに2つの句を入れることはできませんか?あなたが提供したコードからどんなエラーが出ていますか? – StriplingWarrior

+0

"私は理想的には、1パーセンタイルではないものをフィルタリングするために2回。 - 何を止めているの?あなたは通常、.Where文を連鎖させるだけです: 'rows.Where(...)。Where(...)'これを試してみるとどうなりますか、コードはどのように見えますか? – StriplingWarrior

答えて

2

私は本当にあなたのLINQクエリで混乱していて、本当にあなたのコードがやろうとしているものは反映されません。あなたが最初の段落に記述行動のように思えます。

var myHoldingsDistribution = new Dictionary<object, object>(); 
var rows = new[] {new {Descendants = new[]{new {Name = new {LocalName = "test"}, Value = 0.05}}}}; 
var keyName = "test"; 
var valueName = "test"; 
var multiplier = 2d; 
foreach (var row in rows) 
{ 
    myHoldingsDistribution.Add(row.Descendants 
     .Where(y => y.Name.LocalName == keyName) 
     .Select(q => q.Value).Max(), 
     row.Descendants.Where(y => y.Name.LocalName == valueName) 
         .Select(q => q.Value).Max() * multiplier); 

} 

編集を次のコードをコンパイルし、うまく動作しますので、私は、あなたのコードで抱えている問題は何よりもあなたのDouble.Parse方法の配置を行うことがより多くを持っていると信じて

私はまだこの質問で非常に混乱しています。これまでのところ、あなたは、次の要件を与えてくれた:

  1. は、LINQのXMLステートメントで句
  2. は私のデータセット
  3. FROM辞書オブジェクト
  4. SELECT *のための1つの追加文で2つのwhere句を持っている2を持っています
  5. は、1でないものを除外します。パーセンテイル

私はそれらが必要と思わないので、最初の2つは無視します。第3の要件は、データフォーマットが多少固定であると仮定すると、比較的簡単です。 (あなたは本当に1「年」タグと一つの「ALMRunResults_Year」タグを持つことを意味していましたか?)

// Move the data into an object that can easily be manipulated. 
var transform = from r in rows 
       select new 
       { 
        key = r.Element(keyName).Value, 
        value = Double.Parse(r.Element(valueName).Value), 
        statistic = r.Element(statisticName).Value 
       }; 

をあなたは、このような値を選択したら、あなたはちょうどあなたがしたフィルタを実行するためのオブジェクトにLINQを使用することができます記述、およびToDictionaryを呼び出して結果のコレクションから辞書を作成します。

var myHoldingsDistribution = transform 
    // Filter out anybody that's not 1 percentile 
    .Where(r => r.statistic == statisticFilter) 
    // Create a dictionary out of the keys and values 
    .ToDictionary(r => r.key, r => r.value); 

私はあなただけで罰金以下のセットアップ与えコンパイルして実行与えた2つのコード・ブロック:

var text = 
@"<Root> 
    <Table> 
     <ALMRunResults_Year>1</ALMRunResults_Year> 
     <Statistic>0 Percentile</Statistic> 
     <Return_Value>0.0535644000000</Return_Value> 
    </Table> 
    <Table> 
     <ALMRunResults_Year>2</ALMRunResults_Year> 
     <Statistic>1 Percentile</Statistic> 
     <Return_Value>0.0535644000000</Return_Value> 
    </Table> 
</Root>"; 
var doc = XDocument.Parse(text); 
var rows = doc.Descendants("Table"); 

var keyName = "ALMRunResults_Year"; 
var valueName = "Return_Value"; 
var statisticName = "Statistic"; 
var statisticFilter = "1 Percentile"; 

それは意味がありますか?

統計のみ= "0パーセンタイル、 25パーセンタイル、50パーセンタイル、75パーセンタイル " など

ですから、約2句を話していた編集2

、たとえば、パーセンタイル= 0またはパーセンタイル= 25の場合は?これを行うにはいくつかの方法があります。最も簡単なのはおそらくContainsメソッドを使用している可能性があります。

var statisticFilters = new[]{ 
    "0 Percentile", "25 Percentile", "50 Percentile", "75 Percentile" 
}; 
... 
var myHoldingsDistribution = transform 
    .Where(r => statisticFilters.Contains(r.statistic)) 
    .ToDictionary(r => r.key, r => r.value); 
+0

基本的には、私のデータセットをSELECT * FROMから選択します。 – user533978

+0

WHERE Statisticのみ= "0パーセンタイル、25パーセンタイル、50パーセンタイル、75パーセンタイル"など、 "99パーセンタイル"などの他のタグはすべて無視します。 – user533978

+0

@ user533978: 。 – StriplingWarrior

関連する問題