我正在为社交做准备。我想知道为什么
(false == []) === true
, 同时
(false == Boolean([])) === false
.
如何解释这样的现象?
我知道在第一种情况下将调用数组ToPrimitive()
,然后它应该像这样工作valueOf()
。也许我错了,但看起来这个方法会返回length
0,这是一个假值,对吧?
我正在为社交做准备。我想知道为什么
(false == []) === true
, 同时
(false == Boolean([])) === false
.
如何解释这样的现象?
我知道在第一种情况下将调用数组ToPrimitive()
,然后它应该像这样工作valueOf()
。也许我错了,但看起来这个方法会返回length
0,这是一个假值,对吧?
总的来说,在这个问题之后,我决定写一个例子,但不幸的是我没有掌握它😢。也许你们中的一个可以帮我完成它。
我们有这样一类人
class Person
{
public Person(string firstName, string lastName,
Address address, Employment employment)
{
FirstName = firstName;
LastName = lastName;
Address = address;
Employment = employment;
}
public string FirstName { get; }
public string LastName { get; }
public Address Address { get; }
public Employment Employment { get; }
public override string ToString()
{
return $"{FirstName} {LastName}: "
+ Environment.NewLine +
$"{Address}"
+ Environment.NewLine +
$"{Employment}";
}
}
与同伴课程
class Address
{
public string City { get; set; }
public int PostCode { get; set; }
public override string ToString()
{
return $"Адрес: {City}-{PostCode} ";
}
}
class Employment
{
public string CompanyName { get; set; }
public string Position { get; set; }
public int AnnualIncome { get; set; }
public override string ToString()
{
return $"Работа: {CompanyName}, должность: {Position}, зарплата: {AnnualIncome}";
}
}
独立设法只编写这样一个构建器
class PersonBuilder
{
//аккумулятор названий свойств и их значений
private readonly Dictionary<string, object> _propertiesToBuild;
public PersonBuilder()
{
_propertiesToBuild = new Dictionary<string, object>();
}
//запоминание в словаре названия свойства и его значения
public PersonBuilder Set<T>(Expression<Func<Person, T>> expression, T value)
{
var propertyName = ((MemberExpression)expression.Body).Member.Name;
_propertiesToBuild.Add(propertyName, value);
return this;
}
public T Include<T>(Expression<Func<Person, T>> expression)
{
var propertyName = ((MemberExpression)expression.Body).Member.Name;
if (propertyName == nameof(Person.Address))
{
var result = new Address();
return (T)(object)result;
}
else
{
var result = new Employment();
return (T)(object)result;
}
}
//создание экземпляра на основе значений свойств из словаря
public Person Build()
{
return new Person
(
firstName: GetPropertyValue<string>(nameof(Person.FirstName), "Неизвестно"),
lastName: GetPropertyValue<string>(nameof(Person.LastName), "Неизвестно"),
address: new Address(),
employment: new Employment()
);
}
private T GetPropertyValue<T>(string propertyName, T defaultValue)
{
return _propertiesToBuild.TryGetValue(propertyName, out var value) ? (T)value : defaultValue;
}
}
虽然它是这样工作的
var person = new PersonBuilder()
.Set(p => p.FirstName, "Андрей")
.Set(p => p.LastName, "Иванов")
.Build();
或者
Address address = new PersonBuilder()
.Set(p => p.FirstName, "Андрей")
.Set(p => p.LastName, "Иванов")
.Include(p => p.Address);
或者像这样
Employment employment = new PersonBuilder()
.Set(p => p.FirstName, "Андрей")
.Set(p => p.LastName, "Иванов")
.Include(p => p.Employment);
我希望结果是这样的
Person person = new PersonBuilder()
.Set(p => p.FirstName, "Андрей")
.Set(p => p.LastName, "Иванов")
.Include(p => p.Address)
.Set(a => a.City, "Москва")
.Include(p => p)
.Include(p => p.Employment)
.Set(e => e.Position, "инженер")
.Include(p => p)
.Build();
PS结果版本在这里,谢谢@Vasek
这是一张桌子
CREATE TABLE [dbo].[Employees] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] NVARCHAR (50) NOT NULL,
[ManagerId] INT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC),
CONSTRAINT [FK_Employees_Employees] FOREIGN KEY ([ManagerId]) REFERENCES [dbo].[Employees] ([Id])
);
这样的要求
SELECT Id, Name, ManagerId
FROM dbo.Employees;
给出这个结果
+----+----------+-----------+
| Id | Name | ManagerId |
+----+----------+-----------+
| 1 | Иван | NULL |
| 2 | Мария | 7 |
| 3 | Кристина | 7 |
| 4 | Виктор | 1 |
| 5 | Сергей | 1 |
| 6 | Григорий | 7 |
| 7 | Мирон | 1 |
+----+----------+-----------+
如果提出这样的要求
SELECT em.Id
, em.Name AS 'Manager'
, m.Name
FROM dbo.Employees AS em
RIGHT JOIN dbo.Employees AS m
ON em.Id = m.ManagerId
ORDER BY em.Id;
变成这样
+------+---------+----------+
| Id | Manager | Name |
+------+---------+----------+
| NULL | NULL | Иван |
| 1 | Иван | Виктор |
| 1 | Иван | Сергей |
| 1 | Иван | Мирон |
| 7 | Мирон | Григорий |
| 7 | Мирон | Мария |
| 7 | Мирон | Кристина |
+------+---------+----------+
所以我试图转身LEFT JOIN
SELECT em.Id
, em.Name
, m.Name AS 'Manager'
FROM dbo.Employees AS em
LEFT JOIN dbo.Employees AS m
ON em.Id = m.ManagerId
ORDER BY m.Id;
我明白了
+----+----------+----------+
| Id | Name | Manager |
+----+----------+----------+
| 2 | Мария | NULL |
| 3 | Кристина | NULL |
| 4 | Виктор | NULL |
| 5 | Сергей | NULL |
| 6 | Григорий | NULL |
| 7 | Мирон | Мария |
| 7 | Мирон | Кристина |
| 1 | Иван | Виктор |
| 1 | Иван | Сергей |
| 7 | Мирон | Григорий |
| 1 | Иван | Мирон |
+----+----------+----------+
如何修复并获取左侧的完整员工列表,右侧的经理是谁?
这是问题的更正和更新版本。
我以标准方式创建一个项目(我刚刚开始掌握为 android 编写程序)。
(API的选择不会以任何方式影响错误的发生,已经过经验验证)
并且在输出中我得到了一个项目,但设计器没有显示,以及任何其他元素。你可以看到错误信息
TextView
如果项目在模拟器或设备上编译并运行,则会显示文本。
只要复仇找到了解决方案
,就/res/values/styles.xml
必须改变
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">...</style>
在
<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">...</style>
这个决定让我有点紧张。结果是某种拐杖。当我完成界面设计后,是否需要返回样式设置?
在 build.grandle(Module.app) 中,依赖项是这样的
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
我最近在使用包时遇到了很多问题nuget
。Visual Studio 加载有错误的包列表,并且所选包无法安装。
严重性代码描述项目文件行抑制状态错误从源“nuget.org”检索“Refit.4.3.0”的包元数据时出错。发送请求时出错。底层连接已关闭:发送时发生意外错误。无法从传输连接中读取数据:远程主机强行终止了现有连接。远程主机强行终止现有连接 0
如果您访问该站点并尝试从那里下载,则会出现消息“建立安全连接时出错”。只有我还是很多人?这可能是与推车摔跤的结果吗?
PS 我必须在具有适当设置的Linux虚拟机上下载该软件包并像这样安装它
PM> Install-Package refit -Source C:\Temp\
假设在代码前面的某个地方我保存了变量的类型
Type type = typeof(Int32);
value
现在,有了一个类型变量,object
我需要type
像这样使用我的 c 转换,
var i = (type)value;
但这不起作用。可以做什么?
UPD 以防万一,这也不起作用。
var i = (type)Convert.ChangeType(value, type);
UPD2:应 Pavel Mayorov 的要求,我将我的评论添加到问题中:
“......想法是这样的:有一个带有属性Object Value
和属性的基本抽象类Type ValueType
。一个继承这个抽象类的具体类,将为该属性分配所需的类型ValueType
,并且该属性本身将具有Value
重要的价值。此外,当使用从抽象类继承的类型集合时,可以通过从." 中Value
获取类型来提取所需类型的值。ValueType
我们有这样一个类和方法
public class TestClass
{
public void Swap<T>(ref T first, ref T second)
{
T tmp = second;
second = first;
first = tmp;
}
}
我正在尝试使用反射并调用方法
[TestMethod]
public void InvokeGenericMethod()
{
MethodInfo method = typeof(TestClass).GetMethod("Swap");
MethodInfo methodWithInt = method.MakeGenericMethod(typeof(int));
int one = 1;
int two = 2;
object[] arguments = { one, two };
methodWithInt.Invoke(this, arguments);//здесь ошибка
Assert.AreEqual(one, 2);
}
我得到一个错误{"Объект не соответствует конечному типу."}
它是怎么做的?谷歌导致了一个参数的例子out
,由于某种原因,一切都像往常一样被调用,即 参数数组是像我一样创建的,然后通过Invoke()
. 有什么想法?
所以一切都好
public virtual IEnumerable<TEntity> Get()
{
return Context.Set<TEntity>().ToList();
}
但值得一试
public virtual Task<IEnumerable<TEntity>> Get()
{
return Context.Set<TEntity>().ToListAsync();
}
你会得到一个隐式的转换错误'System.Threading.Tasks.Task<System.Collections.Generic.List<TEntity>>' to 'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<TEntity>>'
提出这个问题很大程度上是受到了对类似问题的回答的启发。以我的拙见,这个答案没有解释任何东西。是的,泛化情况下的协方差不起作用,尽管等等,第一个例子中的一切都好,还是不好?或者协方差仅在以下情况下才停止工作Task<>
?
已经有一个关于文本阴影的问题并且已经得到了 回答。
简而言之,解决方案的本质是FormattedText
从内容中创建一个隐藏的TextBlock
,然后从中创建一个几何体FormattedText
,使用显示Path
,然后使用动画在其上绘制。
当文本占一行时一切正常,但是当有几行时,结果就不是我们想要的了。
我不会重复 XAML,因为 它与上述答案中的完全相同。我的代码也没有太大区别,但为了清楚起见,我将给出它。
private List<Rect> _RectsForFill; // прямоугольники с каждым символом
private double _LengthFillText; // общая ширина рисованного текста
//анимация
Storyboard _Storyboard;
DoubleAnimation _FromAnimation;
DoubleAnimation _ToAnimation;
private void CreateFillText()
{
//получаем текстовое содержимое
TextBlock tb = this.textBlockHidden;
var text = tb.Text;
//создаем экземпляр форматированного текста
FormattedText formattedText = new FormattedText(
text,
CultureInfo.GetCultureInfo("en-US"),
FlowDirection.LeftToRight,
new Typeface(
tb.FontFamily,
tb.FontStyle,
tb.FontWeight,
tb.FontStretch),
tb.FontSize,
Brushes.Black // конкретная кисть нам не важна, мы используем только геометрию
);
//берем переносы строк у эталонного текстблока
formattedText.MaxTextWidth = this.textBlockHidden.Width;
formattedText.MaxTextHeight = this.textBlockHidden.Height;
// стащили геометрию у текста...
var geo = formattedText.BuildGeometry(new Point());
// ...и отдали её Path'у
Target.Data = geo;
//вычислим прямоугольники для заполнения
GetRectsForFill(text, formattedText);
}
private void GetRectsForFill(string text, FormattedText formattedText)
{
var bb = formattedText.BuildHighlightGeometry(new Point());
_LengthFillText = bb.Bounds.Width; // общая ширина
//заполняем коллекцию побуквенных боксов
_RectsForFill = Enumerable.Range(0, text.Length)
.Select(k => formattedText.BuildHighlightGeometry(new Point(), k, 1)
.Bounds)
.ToList();
//ссылки на анимацию для дальнейшей работы с ней
_Storyboard = (Storyboard)Target.Resources["AnimationStoryboard"];
_FromAnimation = (DoubleAnimation)_Storyboard.Children[0];
_ToAnimation = (DoubleAnimation)_Storyboard.Children[1];
}
这是一种用黑色填充渲染文本的方法
/// <summary>
/// Закрашивание рисованного текста
/// </summary>
/// <param name="startPos">начальная позиция слова</param>
/// <param name="count">число закрашиваемых букв в слове</param>
public void FillTextPath(int startPos, int count)
{
if (count == 0) throw new ArgumentException(nameof(count));
//вычисляем индекс необходимого прямоугольника
int index = startPos + count;
if (index >= _RectsForFill.Count) index = _RectsForFill.Count - 1;
//необходимый прямоугольник
Rect box = _RectsForFill[index];
//закрашиваем
_FromAnimation.From = box.Left / _LengthFillText;
_FromAnimation.To = box.Right / _LengthFillText;
_ToAnimation.From = box.Left / _LengthFillText;
_ToAnimation.To = box.Right / _LengthFillText;
_Storyboard.Begin();
}
我有一个用于文本到语音转换的实用程序类,在其构造函数中可以选择必要的合成器语言,但问题是用户可能未安装该语言,然后,如果出现错误,选择列表中的第一种语言
//это конструктор
public SpeechSynth()
{
//выбираем голос по-умолчанию
try
{
SelectedVoice = _Synthesizer
.GetInstalledVoices()
.First(v => v.VoiceInfo.Description.Contains("France"));
}
catch (Exception)
{
//тогда выбираем первый доступный
SelectedVoice = _Synthesizer.GetInstalledVoices().First();
Debug.WriteLine("Ошибка выбора голоса при инициализации.");
//throw;
}
}
这是 ViewModel 的开始
private SpeechSynth _Speech;
//ctor
public MainViewModel()
{
try
{
_Speech = new SpeechSynth();
}
catch (Exception)
{
//здесь хотелось бы сообщить пользователю, что целевой язык не доступен
//требуется его установить.
}
}
因此,在块中的 VM 构造函数中,catch
我仍然无法告诉用户任何信息(MessageBox
例如调用)。这样的问题怎么解决?也许是一些延迟加载之类的?
PS 说明,原则上,当然,如果您在 VM 中 zafigachit MessageBox,那么它可以显示,但事实并非如此。为了调用 MessageBox,使用了一个实用消息类,顺便说一句,它也从构造函数中进行初始化,此外,从构造函数中用合成器完成了一些其他事情(我删除了所有这些以免干扰主要的事情与次要的)。如果出现错误,_Speech
它会变成 == null,并且仍然无法使用它。
System.IO.IOException 未处理消息:PresentationCore.dll 中出现类型为“System.IO.IOException”的未处理异常附加信息:无法从流中读取数据。
错误偶尔出现。该算法如下:
ListBox
,它与集合相关联ObservableCollection<BitmapImage>
这是填充集合的方法
/// <summary>
/// Заполнение списка картинок
/// </summary>
/// <param name="addresses"></param>
private void LoadListImages(List<string> addresses)
{
//будущая коллекция картинок
ListImages = new ObservableCollection<BitmapImage>();
//to UI
MessageUser.MessageJob.Report("Загружаем картинки...");
try
{
int i = 1;
BitmapImage bImage = null;
foreach (var address in addresses)
{
//to UI
MessageUser.MessageJob.Report($"Загружаем {i}...");
//новая картинка
bImage = new BitmapImage(new Uri(address, UriKind.RelativeOrAbsolute));
//размеры
bImage.DecodePixelHeight = 100;
bImage.DecodePixelWidth = 100;
//картинку в коллекцию
ListImages.Add(bImage);
//счетчик
i++;
}
}
catch (Exception ex)
{
Debug.WriteLine($"{nameof(LoadListImages)} - {ex.Message}");
throw;
}
}
该方法奏效了。我什至一步一步地经历了它,甚至在发生这个错误的情况下,但是在退出方法后立即发生错误,即,据我了解,在用户界面应该已经开始显示图片并BitmapImage
开始“加载”所需的链接。如何克服?
如果我们想从方法中得到List<T>
如何正确地做:
List<T> Method() {...}
IList<T> Method() {...}
IEnumerable<T> Method() {...}
ICollection<T> Method() {...}
为什么?
如果我们想按List<T>
原样传递给方法:
void Method(List<T> list) {...}
void Method(IList<T> list) {...}
void Method(IEnumerable<T> list) {...}
void Method(ICollection<T> list) {...}
为什么?
PS 原则上,这两种情况对public
和都有意义private
。例如,实体框架在这里生成方法 c ICollection。人们通过 IEnumerable 工作的例子有很多。这是为什么?
告诉我,任何人都可以通过 HttpClient 地址下载 http://www.wordreference.com/definition/like作为回应我明白了
是加密的内容,然后通过脚本打开浏览器吗?或者是别的什么?为了以防万一,我解释说:我在其他站点上尝试了我的代码,那里一切正常,我怀疑编码是问题所在。
应该用PS解压HttpClientHandler
private static async Task<string> GetAnswerAsync(string request)
{
string result = String.Empty;
HttpClientHandler handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (HttpClient client = new HttpClient(handler))
using (var response = await client.GetAsync(request))
{
response.EnsureSuccessStatusCode();
result = await response.Content.ReadAsStringAsync();
}
return result;
}
当一个操作同时需要两者时如何正确编写?
try
{
lock(locker)
{
....
}
}
catch(...)
{
...
}
或者
lock(locker)
{
try
{
...
}
catch(...)
{
...
}
}
以及如果发生异常会被锁住怎么办?
我决定在这里研究 Xamarin.Android。而且我找不到正确组织典型应用程序的“指导性”正确说明。
正如我设法看到的那样,由于缺乏绑定,机器人中的 MVVM 是不可能的,好吧,也许然后是 MVP?!不,那也是胡说八道。我在 YouTube 上看过多少课程 - 一切都是模塑的,有时甚至是编写 UI,直接进入课堂MainActivity
。从处理程序开始的一个巨大的工作表OnCreate
,让我们开始吧:我们立即创建带有视图的内容,立即订阅事件,事件处理程序在下面,等等。就像本科生一样。
你能告诉我一些关于这个话题的事情吗,我特别呼吁那些已经与 zamarin 合作过很多的人。谢谢你。
两个用于记住解析的类:
class Answer
{
public int Index { get; set; }
public bool Correct { get; set; }
public string Desc { get; set; }
}
class Question
{
public int Id { get; set; }
public string Content { get; set; }
public string MainQuestion { get; set; }
public int MainQuestionContent { get; set; }
public List<Answer> Answers { get; set; } = new List<Answer>();
}
接下来,XML 本身及其解析:
static void Main(string[] args)
{
string xml = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
<testing>
<questions>
<question id=""1"" content=""hi"">
<main_question content=""1"">Вопрос 1</main_question>
<answer index=""1"" correct=""true"">Ответ 1</answer>
<answer index=""2"" correct=""true"">Ответ 2</answer>
<answer index=""3"" correct=""false"">Ответ 3</answer>
</question>
</questions>
</testing>";
XElement elements = XElement.Parse(xml);
List<Question> questionsList = new List<Question>();
Question itemQuestion;
Answer itemAnswer;
foreach (XElement question in elements.Element("questions").Elements("question"))
{
itemQuestion = new Question();
itemQuestion.Id = Convert.ToInt32(question.Attribute("id")?.Value);
itemQuestion.Content = question.Attribute("content")?.Value;
itemQuestion.MainQuestion = question.Element("main_question")?.Value;
itemQuestion.MainQuestionContent = Convert.ToInt32(question.Element("main_question")?.Attribute("content")?.Value);
var answers = from a in question.Elements("answer")
select new
{
AttributeIndex = a.Attribute("index")?.Value,
AttributeCorrect = a.Attribute("correct")?.Value,
Answer = a?.Value
};
if (answers.Any())
{
foreach (var item in answers)
{
itemAnswer = new Answer();
itemAnswer.Index = Convert.ToInt32(item.AttributeIndex);
itemAnswer.Correct = Convert.ToBoolean(item.AttributeCorrect);
itemAnswer.Desc = item.Answer;
itemQuestion.Answers.Add(itemAnswer);
}
}
questionsList.Add(itemQuestion);
}
}
我想把foreach (XElement question in elements.Element("questions").Elements("question"))
它变成 LINQ 查询,但我不知道该怎么做。
感谢@Grundy 的提示,原来是这样优化的:
List<Question> questionsList = (from question in elements.Element("questions").Elements("question")
select new Question()
{
Id = Convert.ToInt32(question.Attribute("id")?.Value),
Content = question.Attribute("content")?.Value,
MainQuestion = question.Element("main_question")?.Value,
MainQuestionContent = Convert.ToInt32(question.Element("main_question")?.Attribute("content")?.Value),
Answers = (from a in question.Elements("answer")
select new Answer
{
Index = Convert.ToInt32(a.Attribute("index")?.Value),
Correct = Convert.ToBoolean(a.Attribute("correct")?.Value),
Desc = a?.Value
}).ToList()
}).ToList();
如何从此控件获取 html 页面,以便将其加载到 HtmlAgilityPack.HtmlDocument 中?在 LoadCompleted 事件中,您可以访问属性:var doc = this.webBrowser.Document; 但关键是这个属性是object类型的。怎样成为?