使用 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);
}
}
}
您可以使用 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。
我正在尝试编写一个 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);
}
}
}
您可以使用 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。