-4

メソッドに特定の戻り値の型があることを望みますが、どういうわけか機能させることができません。

私はXML構造を持っています:

<Notifications>
   <Alerts>
      <Max>3<Max/>
      <Med>2<Med/>
      <Min>1<Min/>
   </Alerts>
</Notifications>

MaxMed、の値を取得したいと思いますMin。しかし、主なポイントは、foreach ループはまったく必要ないということです。メソッドに List<string> 戻り値の型が必要なだけでなく、ジェネリックな戻り値の型を作成することもできます。

ポイントは、そのプロパティを埋めるカスタムクラスを持っていない (そして私はそれを持ちたくない) ということです。

これは私が持っているものですが、「List()」匿名メソッドでエラーが発生しました:

Here it returns:
List<string> items = GetAlerts();

//method to read:
public List<string> GetAlerts()
{
    return xmlDoc1.Descendants("Notifications").Elements("Alerts").Select(s => new
    {
        MAX = s.Element("Max").Value,
        MED = s.Element("Med").Value,
        MIN = s.Element("Min").Value
     }).ToList(); //error on this line
}

----------


そして、このメソッドが一般的な戻り値の型になるとしたら、どのように見えるでしょうか? これはOKではありません:

Here it returns: 
List<object> items = setBLL2.GetAlert<List<object>>();

public T GetAlert<T>() where T:class
{
    return (T)xmlDoc1.Descendants("Notifications").Elements("Alerts").Select(s => new
    //ERROR up here before (T
    {
         MAX = s.Element("Max").Value,
         MED = s.Element("Med").Value,
         MIN = s.Element("Min").Value
     }).ToList();
}

エラーメッセージは次のとおりです。

タイプ 'System.Collections.Generic.List' を 'T' に変換できません

4

3 に答える 3

4

メソッドの境界を越えて匿名型を転送することはできません (この場合、List<T>メソッドから返されるジェネリック型として)。

MaxMed、およびをプロパティとして使用してクラスまたは構造体を定義しMin、メソッドからそのインスタンスのリストを初期化する必要があります。

public class Alert
{
    public string Max { get; set; }
    public string Med { get; set; }
    public string Min { get; set; }
}

public IList<Alert> GetAlerts()
{
    return (xmlDoc1.Descendant("Notifications").Elements("Alerts").Select(s => 
        new Alert
        {
            Max = s.Element("Max").Value,
            Med = s.Element("Med").Value,
            Min = s.Element("Min").Value
        }).ToList();
}

編集:代わりに、プロパティ名をそれらの値にマッピングする辞書のリストを返すことができます:

public IList<Dictionary<string,string>> GetAlerts()
{
    return (xmlDoc1.Descendant("Notifications").Elements("Alerts").Select(s => 
        new Dictionary<string,string>
        {
            { "Max", s.Element("Max").Value },
            { "Med", s.Element("Med").Value },
            { "Min", s.Element("Min").Value }
        }).ToList();
}

次のようなコードを使用して、値にアクセスできます。

string firstMin = alerts[0]["Min"];
于 2012-06-07T18:13:32.620 に答える
0

残念ながら、LINQ クエリ内の List の個別のエントリで返される MAX、MED、および MIN を取得する方法がわかりません。ただし、できることは、LINQ クエリで MIN、MED、および MAX を List オブジェクトに入れ、最初の行を返すことです。

public IList<Alert> GetAlerts() 
{ 
    var xmlDoc1 = XDocument.Parse(XML, LoadOptions.None);
    var entries = xmlDoc1.Descendants("Notifications").Elements("Alerts").Select(s => new
        List<string> {
            s.Element("Max").Value,
            s.Element("Med").Value,
            s.Element("Min").Value
        }).ToList();
    // Make sure we don't get an ArgumentOutOfRangeException
    if (entries.Count > 0)
    {
        return entries[0];
    }
    else
    {
        return new List<string>();
    }
}

PS - MIN、MAX、および MED の終了タグの形式が正しくありません。「/」は名前の後ではなく前にある必要があります。

于 2012-06-07T18:25:29.393 に答える
0

代わりにこれを試してください:

void Main()
{
   List<string> alerts =

   XDocument.Parse(Data)
            .Descendants("Alerts")
            .Elements()
            .Select (nd => nd.Value)
            .ToList();

   alerts.ForEach(al => Console.WriteLine ( al ) );     // 3 2 1 on seperate lines

}

// Define other methods and classes here
const string Data = @"<?xml version=""1.0""?>
<Notifications>
   <Alerts>
      <Max>3</Max>
      <Med>2</Med>
      <Min>1</Min>
   </Alerts>
</Notifications>";
于 2012-06-07T18:16:21.117 に答える