使用 c# 从主应用程序 class 中的另一个方法获取两个结果

Get two results from another method in the the main application class using c#

我正在尝试编写一个 c# 代码,我想通过它从网络 api 获取图像,并从 api 获取图像的标题。我实现了一个名为 GetImage 的方法,并尝试从中 return 两个结果(图像和标题)。但是我写了一个代码但是因为我是新手处理这种情况,我不知道在这种情况下该怎么做。

我的图像服务 class 其中包含的方法是-

public class ImageService
{
    public string GetImage(string name)
    {                
        string result1;
        string result2;

        using (WebClient client = new WebClient())
        {
            var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
            string requestUrl = string.Format(uri, name);
            var response = client.DownloadString(new Uri(uri));
            var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
            var firstKey = responseJson.query.pages.First().Key;
            result1 = responseJson.query.pages[firstKey].thumbnail.source;
            result2 = responseJson.query.pages[firstKey].title;

            var hash = uri.GetHashCode();

        }
        return result1,result2; //showing error
    }
}

现在 Form1.cs 我想在图片框和标签中显示结果的地方是-

public partial class Form1 : Form
{
    private readonly ImageService _imageService;
    public Form1()
    {            
        _imageService = new ImageService();
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text));
        label1.Text = _imageService.GetImage(textBox1.Text);// not working
    }
}

由于一个方法只能有一个 return 值,您可以使用 out 参数来 return 另一个值。

public string GetImage(string name, out string title)
{
    string result1;

    using (WebClient client = new WebClient())
    {
        var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
        string requestUrl = string.Format(uri, name);
        var response = client.DownloadString(new Uri(uri));
        var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
        var firstKey = responseJson.query.pages.First().Key;
        result1 = responseJson.query.pages[firstKey].thumbnail.source;
        title = responseJson.query.pages[firstKey].title;

        var hash = uri.GetHashCode();
     }
     return result1;
 }

用法;

private void button1_Click(object sender, EventArgs e)
{
     string title = string.Empty;

     pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
     pictureBox1.LoadAsync(_imageService.GetImage(textBox1.Text, out title));
     label1.Text = title;
}

您只能从一个函数中 return 1 个值。因此,要解决这个问题,您有 2 个选择:

  • 使用函数的out参数
  • Return 具有 2 个属性的自定义对象

自定义对象解决方案:

public class ImageResult
{
    string ImageUrl { get; set; }
    string Title { get; set; }
}

public ImageResult GetImage(string imageTitle)
{                
    ImageResult result = new ImageResult();

    using (WebClient client = new WebClient())
    {
        var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+imageTitle;
        string requestUrl = string.Format(uri, imageTitle);
        var response = client.DownloadString(new Uri(uri));
        var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
        var firstKey = responseJson.query.pages.First().Key;

        result.ImageUrl = responseJson.query.pages[firstKey].thumbnail.source;
        result.Title = responseJson.query.pages[firstKey].title;

        var hash = uri.GetHashCode();

    }
    return result;
}

private void button1_Click(object sender, EventArgs e)
{
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;

    var imageResult = _imageService.GetImage(textBox1.Text);

    pictureBox1.LoadAsync(imageResult.ImageUrl);
    label1.Text = imageResult.Title;
}

您不能 return 从类似的方法中获取多个值。

将方法配置文件更改为:

private Tuple<string, string> GetImage(string name)

和 return 声明:

return new Tuple<string, string>(result1, result2);

然后您可以从元组中提取每个结果:

var resultTuple = _imageService.GetImage(textBox1.Text);
label1.Text = resultTuple.Item1;
label2.Text = resultTuple.Item2;

最好的方法是创建一个新的 class 来保存您需要的详细信息 return。这样,如果您需要添加更多信息,只需将其添加到 class.

例如:

public class ImageInfo
{
    public string Title { get; set; }
    public string Image { get; set; }
}

那么你的方法 return 就是 class:

public ImageInfo GetImage(string name)
{                
    ImageInfo info = new ImageInfo();

    using (WebClient client = new WebClient())
    {
        var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
        string requestUrl = string.Format(uri, name);
        var response = client.DownloadString(new Uri(uri));
        var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
        var firstKey = responseJson.query.pages.First().Key;
        info.Image = responseJson.query.pages[firstKey].thumbnail.source;
        info.Title = responseJson.query.pages[firstKey].title;

        var hash = uri.GetHashCode();

    }
    return info;
}

使用元组。 例子

using System;

class Program
{
    static void Main()
    {
    // Create three-item tuple.
    Tuple<int, string, bool> tuple =
        new Tuple<int, string, bool>(1, "cat", true);
    // Access tuple properties.
    if (tuple.Item1 == 1)
    {
        Console.WriteLine(tuple.Item1);
    }
    if (tuple.Item2 == "dog")
    {
        Console.WriteLine(tuple.Item2);
    }
    if (tuple.Item3)
    {
        Console.WriteLine(tuple.Item3);
    }
    }
}

字体http://www.dotnetperls.com/tuple

您可以使用 class:

public class Image
{
    public string Url { get; internal set; }
    public string Title { get; internal set; }

    public Image(string name)
    {
       string result1;
       string result2;

        using (WebClient client = new WebClient())
        {
            var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
            string requestUrl = string.Format(uri, name);
            var response = client.DownloadString(new Uri(uri));
            var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
            var firstKey = responseJson.query.pages.First().Key;
            result1 = responseJson.query.pages[firstKey].thumbnail.source;
            result2 = responseJson.query.pages[firstKey].title;

            var hash = uri.GetHashCode();

        }
        Url = result1;
        Title = result2;
    }
}

并像这样使用它:

private void button1_Click(object sender, EventArgs e)
{
    var img = _imageService.GetImage(textBox1.Text);

    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
    pictureBox1.LoadAsync(img.Url);
    label1.Text = img.Title;
}

有多个选项可供选择。

您可以 return 像这样的字典:

        public Dictionary<string, string> GetImage(string name)
        {
            string result1;
            string result2;

            using (WebClient client = new WebClient())
            {
                    var uri = "https://en.wikipedia.org/w/api.php?action=query&format=json&prop=pageimages&pithumbsize=400&titles="+name;
                    string requestUrl = string.Format(uri, name);
                    var response = client.DownloadString(new Uri(uri));
                    var responseJson = JsonConvert.DeserializeObject<ImgRootobject>(response);
                    var firstKey = responseJson.query.pages.First().Key;
                    result1 = responseJson.query.pages[firstKey].thumbnail.source;
                    result2 = responseJson.query.pages[firstKey].title;

                    var hash = uri.GetHashCode();

            }
            Dictionary<string, string> dictionary = new Dictionary<string, string>();
            dictionary.Add("Source", result1);
            dictionary.Add("Title", result2);
            return dictionary;
        }

然后你可以像这样使用字典:

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
        Dictionary<string, string> imageDictionary = _imageService.GetImage(textBox1.Text);
        pictureBox1.LoadAsync(imageDictionary["Source"]);
        label1.Text = imageDictionary["Title"];
    }

您还可以 return 列出或使用 out 参数,或者如其他答案所述,您可以创建自定义 class 和 return 它。

匿名:

dynamic Get()
{
    return new {Url = "url", Image = "image"};
}

var result = Get();

var url = (string) result.Url;

不过,这通常更适合 LINQ。